构造函数或析构函数之间存在的某些差异是虚拟的还是非虚拟的?在这种情况下,应该做什么
class A {
public:
A();
~A();
}
或
class A {
public:
virtual A();
virtual ~A();
}
这种情况有isocpp吗?
...谢谢
答案 0 :(得分:1)
您不能在C ++ why no virtual Constructor中使用Virtual构造函数。
当您可以通过指向基类的指针删除派生类的实例时,虚拟析构函数很有用。请参阅When to use Virtual Destructor。
答案 1 :(得分:1)
您不能拥有虚拟构造函数,但虚拟析构函数可以在调用派生析构函数时通过基类指针销毁对象。
例如,实际上并不运行此代码
class A {
public:
A() {}
~A() {}
};
class B : public A {
public:
B() {}
virtual ~B() {}
};
class C : public B {
public:
C() : _p( new int(0) ) {}
~C() { delete _p; std::cout << "Deleted p" << std::endl; }
private:
int *_p;
};
int main() {
C *c1 = new C();
C *c2 = new C();
B *bPointer = c1;
A *aPointer = c2;
std::cout << "Deleting through B*" << std::endl;
delete bPointer; // "deleted p"
std::cout << "------------" << std::endl;
std::cout << "Deleting through A*" << std::endl;
delete aPointer; // No output
return 0;
}
A类的析构函数应该被标记为虚拟。您只需要在层次结构的最顶层上编写虚拟。