繁体   English   中英

从 c++ 中派生的 class 的析构函数调用虚拟 function

[英]Calling a virtual function from a destructor of a derived class in c++

这是我的 c++ 代码片段

class A {
public:
    virtual void method() {
        cout << "A::method" << endl;
    }

    virtual ~A() {
        cout << "A::destructor" << endl;
    }

};

class B : public A {
public:
    virtual void method() {
        cout << "B::method" << endl;
    }

    virtual ~B() {
        cout << "B::destructor" << endl;
        method();
    }
};

int _tmain()
{    
    A* a = new B();

    a->method();

    delete a;

    return 0;
}

我了解到从构造函数或析构函数调用任何虚函数是不可取的。 在派生的 class B 的析构函数中,我调用名为“method()”的虚拟 function。

这是 output 消息。

B::method
B::destructor
B::method
A::destructor

在我看来完全没有问题。 虚拟 function 知道其 object 类型并打印“B::method()”。 这是一种应该避免的未定义行为吗?

从概念上讲, B中的所有虚函数都可以在析构函数体中访问,因此您的代码很好并且定义良好。

但是您的代码非常脆弱:如果有一个B的子 class 的method被覆盖,那将是另一回事。 在这种情况下,写B::method(); B的析构函数体中就足够了。

简短的回答:最好避免在构造函数和析构函数中调用虚方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM