`

条款14: 确定基类有虚析构函数

阅读更多
条款14: 确定基类有虚析构函数
对于这个问题来说,我想直接举这个例子就比较好解释了。
class enemytarget {
public:
	enemytarget() { ++numtargets; }
	enemytarget(const enemytarget&) { ++numtargets; }
	~enemytarget() { --numtargets; }

	static size_t numberoftargets()
	{ return numtargets; }

	virtual bool destroy(){return 0;};       // 摧毁enemytarget对象后
	// 返回成功

private:
	static size_t numtargets;     // 对象计数器
};

size_t enemytarget::numtargets=0;

class enemytank: public enemytarget {
public:
	enemytank() { ++numtanks; }

	enemytank(const enemytank& rhs)
		: enemytarget(rhs)          //基类构造函数
	{ ++numtanks; }

	~enemytank() { --numtanks; }

	static size_t numberoftanks()
	{ return numtanks; }

	virtual bool destroy(){return 0;};

private:
	static size_t numtanks;         // 坦克对象计数器
};

size_t enemytank::numtanks=0;

int main()
{
	enemytarget *targetptr = new enemytank;
	cout<<"targetptr: "<<targetptr->numberoftargets()<<endl;
	cout<<"targetptr: "<<enemytank::numberoftanks()<<endl;
    delete targetptr;
	cout<<"targetptr: "<<targetptr->numberoftargets()<<endl;
	cout<<"targetptr: "<<enemytank::numberoftanks()<<endl;

	return 0;
}

结果:
targetptr: 1
targetptr: 1
targetptr: 0             //只调用基类的析构函数
targetptr: 1
Press any key to continue



看吧,DELETE时,派生类中的坦克数量没被释放。解决的方法很简单,把基类的析构函数设为虚函数。那么语意就变为,让派

生类去定制自己的行为。所以说在定制基类时,对其的析构函数都要指定虚函数。
那么是否要对每个基类都申请虚拟函数呢?
    申明一个虚拟函数花费的代价是产生一个32位的指针,这是否会让它变得不可移植了呢?
0
0
分享到:
评论

相关推荐

    C++中确定基类有虚析构函数

    本文给大家介绍了C++中确定基类有虚析构函数的方法。

    虚基类 虚函数成员 虚析构函数

    该资源的内容主要是 虚基类 虚函数成员 虚析构函数的具体的区别

    C++中基类的析构函数为什么要用virtual虚析构函数.pdf

    C++中基类的析构函数为什么要用virtual虚析构函数.pdf

    C++虚析构函数、纯虚析构函数

     因为在C++中,当一个派生类对象通过使用一个基类指针删除,而这个基类有一个非虚的析构函数,则结果是未定义的。运行时比较有代表性的后果是对象的派生部分不会被销毁。然而,基类部分很可能已被销毁,这导致了一...

    C++虚基类 虚函数 虚析构函数

    //析构函数做成员函数 }; Base::~Base()//成员函数实现 { cout; } class Derived:public Base { public: Derived(); ~Derived(); private: int *p; }; Derived::Derived() { p=new int(0);//从堆上分配一个int型...

    C++中虚析构函数的作用

    我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明:

    Effective.C++.中文第二版.50条款doc文档.chm

    条款14: 确定基类有虚析构函数 条款15: 让operator=返回*this的引用 条款16: 在operator=中对所有数据成员赋值 条款17: 在operator=中检查给自己赋值的情况 第四章 类和函数:设计与声明条款 条款18: 争取使类的接口...

    浅谈C++基类的析构函数为虚函数

     在实现多态时, 当用基类指针操作派生类, 在析构时候防止只析构基类而不析构派生类。 2、例子:  (1)、    #include  using namespace std;  class Base{  public: Base() {};  ~Base() {cout &lt;&...

    Effective C++

    条款14:确定基类有虚析构函数 条款15:让OPERATOR=返回*THIS的引用 条款16:在OPERATOR=中对所有数据成员赋值 条款17:在OPERATOR=中检查给自已赋值的情况 3、类和函数:设计与声明 条款18:争取使类的接口完整并且最小 ...

    全面解读C#编程中的析构函数用法

    一个类只能有一个析构函数。 无法继承或重载析构函数。 无法调用析构函数。它们是被自动调用的。 析构函数既没有修饰符,也没有参数。 例如,下面是类 Car 的析构函数的声明: class Car { ~Car() // destructor ...

    虚基类与虚函数

    虚基类与虚函数 虚基类的概念 在C++语言中,一个类不能被多次说明为一个派生类的直接基类,但可以不止一次地成为间接基类。这就导致了一些问题。为了方便 说明,先介绍多继承的“类格”表示法。

    c++ 虚基类和虚函数 代码

    c++ 虚基类和虚函数+代码.有一个案例,里面有源代码。看完就懂什么叫c++ 虚基类和虚函数了

    从汇编看c++的默认析构函数的使用详解

    c++中,如果没有为一个类提供析构函数,那么...2 类继承自一个基类,基类含有自定义析构函数(如果基类没有自定义析构函数,但是编译器会为它提供一个非无用的默认析构函数,也属于这种情况。这就是说,只要基类含有一

    详解C++中虚析构函数的作用及其原理分析

    总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的基类指针时可以调用子类的析构函数达到释放子类中堆内存的目的,而防止内存泄露...

    基类子类虚函数的调用顺序问题

    在虚函数的基类与子类构造函数中调用虚函数。当生成子类对象时,函数的调用顺序是怎样的

    虚基类、虚函数与纯虚函数

    网上看到的一篇比较好的对c++虚类,虚基类,全虚函数的解释

    C++经典资料\虚基类与虚函数

    大家去看看都是好东西。虚基类与虚函数。。。。。。。。。。。。。。。。。。。。。。

    定义基类person,数据成员name,sex,age,构造函数,析构函数,输出name,sex,age的函数display()。②定义公有派生类student

    定义基类person,数据成员name,sex,age,构造函数,析构函数,输出name,sex,age的函数display()。②定义公有派生类student,数据成员:num,构造函数,析构函数,输出name,sex,age,num的函数display()。③ ...

    java kok 构造与析构函数

    进入全屏解码显示时间需要2S以上时间,在屏幕中央显示提示:"正在读取图片,请稍侯…

Global site tag (gtag.js) - Google Analytics