带有g++(Ubuntu)的虚拟关键字的奇怪(?)行为
Strange (?) behavior with virtual keyword with g++ (Ubuntu)
我正在阅读关于虚拟析构函数和虚拟函数的注释。现在,当我试图写一个简单的代码来验证我的学习时,
#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
。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- arr[-1]在c++中的奇怪行为
- 如何确保C++函数在定义之前声明(如override关键字)
- 继承期间显示未知行为的子类
- 如何在c++中使用引用实现类似python的行为
- G锁定铸造到基础上会释放模拟行为
- 在C++中对T*类型执行std::move的意外行为
- std::当在256字节边界上写入整数时,流的奇怪行为
- C++常量关键字异常行为
- 使用关键字继承构造函数时出乎意料的行为
- 带有引用的自动关键字行为
- STD ::对行为的对模板类型扣除?(否,显式关键字错误)
- 访问修饰符在继承中的不同行为取决于"this"关键字和模板或缺少它们
- C++11中的auto关键字奇怪行为
- C++中“virtual”关键字在对象而不是指针上的行为
- 带有g++(Ubuntu)的虚拟关键字的奇怪(?)行为
- 如何在c++中使用class中的static关键字来模拟Python中@classmethod的行为