构造函数和析构函数必须是虚拟的吗?

时间:2015-10-03 13:48:40

标签: c++ c++11 constructor destructor

构造函数或析构函数之间存在的某些差异是虚拟的还是非虚拟的?在这种情况下,应该做什么

class A {
public:
    A();
    ~A();
}

class A {
public:
    virtual A();
    virtual ~A();
}

这种情况有isocpp吗?

...谢谢

2 个答案:

答案 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类的析构函数应该被标记为虚拟。您只需要在层次结构的最顶层上编写虚拟。