gpt4 book ai didi

c++ - 带有 g++ (Ubuntu) 的 virtual 关键字的奇怪 (?) 行为

转载 作者:行者123 更新时间:2023-11-28 07:30:34 26 4
gpt4 key购买 nike

我正在阅读有关虚拟析构函数和虚拟函数的笔记。现在,当我尝试编写一个简单的代码来验证我的学习时,

#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

因为我没有为 derived 和 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();

它正在调用 Derived 类的成员函数。为了使运行时函数调用分派(dispatch)机制起作用,您需要使用 virtual 关键字来限定成员函数。你也应该写 -

Base *d = new Derived();

在上面的例子中,d 的静态类型不同于动态类型。所以,派生类的成员函数会在运行时被调用。此外,在这种情况下,Base 类的析构函数应该是virtual

关于c++ - 带有 g++ (Ubuntu) 的 virtual 关键字的奇怪 (?) 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17824629/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com