带有g++(Ubuntu)的虚拟关键字的奇怪(?)行为

Strange (?) behavior with virtual keyword with g++ (Ubuntu)

本文关键字:行为 关键字 g++ 带有 虚拟 Ubuntu      更新时间:2023-10-16

我正在阅读关于虚拟析构函数和虚拟函数的注释。现在,当我试图写一个简单的代码来验证我的学习时,

#include <iostream>
using namespace std;
class Base{
    public:
    Base (){
        cout << "Constructing base" <<endl;
    }
    void doSomething (){
        cout << "inside void " << endl;
    }
    ~Base (){
        cout << "Destructing base" << endl;
    }
};
class Derived : public Base{
    public:
    Derived(){
        cout << "Constructing derived" << endl;
    }
    void doSomething (){
        cout << "inside derived void " << endl;
    }
    ~Derived(){
        cout << "Destructing derived" << endl;
    }
};
int main(){
    Derived *d = new Derived();
    d->doSomething();
    delete d;
}

我不应该期待这样的输出吗:

Constructing base
Constructing derived
inside void
Destructing base

因为我没有对派生和基的析构函数使用virtual关键字?你能解释一下这个例子中的虚拟函数和虚拟析构函数吗?

我得到这个输出:

Constructing base
Constructing derived
inside derived void 
Destructing derived
Destructing base

我很困惑。

我在Ubuntu 12.04中使用g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

您得到了正确的输出。

Derived *d = new Derived();
d->doSomething();

它正在调用派生类成员函数。为了使运行时函数调用调度机制发挥作用,您需要使用virtual关键字限定成员函数。你也应该写-

Base *d = new Derived();

在上述情况下,d的静态类型不同于动态类型。因此,派生类成员函数将在运行时调用。此外,在这种情况下,Base类析构函数应该是virtual