为什么在构造期间在基类中调用被重写的虚函数
Why does an overridden virtual function get called in the base class during construction?
有一个c++程序:
# include <iostream>
using namespace std;
class base
{
public:
base()
{
cout<<"base"<<endl;
f();
}
virtual void f() {
cout<<"base f"<<endl;
}
};
class derive: public base
{
public:
derive()
{
cout<<"derive"<<endl;
f();
}
void f() {
cout<<"derive f"<<endl;
}
};
int main()
{
derive d;
return 1;
}
,输出:
base
base f
derive
derive f
我想知道为什么基底f出现?
我猜在base中构造函数展开为:
cout<<"base"<<endl;
this.f();
但是这应该指向推导,那么为什么输出底f呢?
在构造过程中,在基类构造函数中,对象的实际类型是base
,尽管它随后继续成为derived
。在销毁过程中也会发生同样的情况,顺便说一句,您也可以使用typeid
来验证类型。
相关文章:
- C++调用使用重写函数的父类函数
- 重写函数不打印基类数据
- 在 c++ 中重写函数时如何选择基类?
- 为什么继承的函数忽略了在原始函数中调用的重写函数?
- 在不提供定义的情况下重写函数有什么意义?
- 建议用户使用 lambda 重写函数
- 如何创建使用重写函数的非成员函数?
- 调用重写函数并使用基类中的重载变量
- 重写函数的默认参数
- 从父级调用派生类重写函数.C++
- C++子类中的重写函数成员
- 函数中的指针不称为派生类的重写函数
- 基类数组中重写函数的使用
- 如何使用协变参数重写函数(在抽象基类中)
- c++ 调用子类而不是父类的重写函数
- C++:从模板化基类重写函数
- 使用派生类的类型重写函数参数类型
- c++仅为特定实例重写函数
- 需要一个关于用const参数重写函数的警告
- Qt/C++重写函数而不进行子类化