C++继承类中析构函数的问题
2013-11-03 20:43
232 查看
如果自己设计的C++类体系中存在继承关系,请注意父子类的析构函数关键字设置。虚函数是在基类中被声明为 virtual,并在派生类中重新定义的成员函数,可实现成员函数的动态重载。 当一个类作为基类时,它的析构函数应该为虚析构函数(基类析构函数前加virtual关键字),这样才能保证调用子类的析构函数。
如过基类的析构函数不是虚析构函数,所以是根据指针的类型调用析构函数,而不是根据指针指向对象的类型调用析构函数,此时就不能执行子类的析构函数了。 #include <iostream> using namespace std; class CBase { public: CBase(int i){
m_data = i;cout << "Constructor of CBase. m_data=" << m_data <<endl;
} virtual ~CBase(){
cout << "Destructor of CBase. m_data=" << m_data <<endl;
} protected: int m_data; }; class CDerived: public CBase { public: CDerived(const char *s): CBase(strlen(s)){
m_data = new char[strlen(s) + 1]; strcpy(m_data, s);
cout << "Constructor of CDerived. m_data = " << m_data << endl;
} virtual ~CDerived(){
delete m_data;cout << "Destructor of CDerived. m_data = " << m_data <<endl;
}
private: char *m_data; }; int main() { CBase *p ; p = new CDerived ("abcd"); delete p; return 0; }
基类的析构函数前必须加virtual关键字,如果一个子类可以保证不会作为其他类的父类出现,其析构函数前可以不加virtual关键字。上面的CDerived类中析构函数前的virtual可加可不加。
相关文章推荐
- 关于虚继承和析构函数的一个奇怪的问题
- 析构函数中的工作目录问题
- C++ 为什么析构函数不能抛出异常问题
- C++中虚析构函数的作用-- 从内存角度来看这个问题
- C++中构造函数和析构函数避免调用虚函数的问题
- 构造函数、析构函数是否要声明为虚函数的问题
- C++ 异常 与 ”为什么析构函数不能抛出异常“ 问题
- C++构造函数以及析构函数的若干面试问题
- 关于创建对象时调用构造函数和析构函数的若干问题
- C++对象构造函数与析构函数的调用时间问题
- C++ 异常 与 ”为什么析构函数不能抛出异常“ 问题
- C++ 异常 与 ”为什么析构函数不能抛出异常“ 问题
- 虚析构函数问题:为什么要将基类的的析构函数设成虚的?
- C++的构造函数 和 析构函数的问题
- 关于多态里父类的析构函数造成子类内存泄露的问题
- 问题:为什么本例中c++析构函数不能正确释放内存及析构
- 拷贝构造函数执行后析构函数调用两次出错问题
- 构造函数和析构函数的调用问题
- 构造函数和析构函数的重载和虚函数的问题
- 关于通过不含虚析构函数的基类类型的指针删除派生类对象的问题