【问题标题】:Constructors and destructor must be virtual? [closed]构造函数和析构函数必须是虚拟的? [关闭]
【发布时间】:2015-12-31 14:50:27
【问题描述】:

构造函数或析构函数是否为虚拟存在一些差异?这种情况下应该怎么办

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

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

这个案例有isocpp吗?

谢谢...

【问题讨论】:

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


【解决方案1】:

C++ 中不能有虚拟构造函数why no virtual Constructor

当您可以通过指向基类的指针删除派生类的实例时,虚拟析构函数很有用。参考When to use Virtual Destructor

【讨论】:

    【解决方案2】:

    您不能有虚拟构造函数,但虚拟析构函数可以通过基类指针销毁对象,同时适当地调用派生析构函数。

    例如,不要实际运行此代码

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

    【讨论】:

    • 我会说他应该出于学习目的运行它:) 但不要在生产代码中使用它!
    猜你喜欢
    • 2013-03-09
    • 2012-04-13
    • 2012-01-28
    • 2016-01-22
    • 2010-09-09
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多