可能是一个简单的问题.我注意到了一些类似的问题,但它们似乎都没有解决我的问题,因此我的帖子.
Base.h:
class Base
{
public:
Base();
protected:
virtual void Create() {}
};
Run Code Online (Sandbox Code Playgroud)
Base.cpp:
Base::Base()
{
Create();
}
Run Code Online (Sandbox Code Playgroud)
Child.h:
class Child : public Base
{
protected:
void Create() override;
};
Run Code Online (Sandbox Code Playgroud)
Child.cpp:
void Child::Create()
{
// Work happens here
}
Run Code Online (Sandbox Code Playgroud)
Create被调用Base而不是Child当我创建Child.为什么不Create打电话Child?
从基类的ctor调用虚方法时,将调用基类的虚方法.这就是语言的定义方式.有这样的原因,如:
void Child::Show()
{
// Work that requires data fields of derived class.
}
Run Code Online (Sandbox Code Playgroud)
如果你Show要从基类的ctor中调用派生类,Child::Show那么会使用数据字段Child但是尚未调用派生类的ctor.
还有其他相关的点值得注意.想像:
class Base // The class is abstract.
{
public:
Base() { Show(); }
protected:
virtual void Show() = 0;
};
class Child : public Base
{
protected:
void Show() override { /* Some work */ }
};
Run Code Online (Sandbox Code Playgroud)
在这种情况下,当您创建任何实例时Child,程序将简单地崩溃,因为尚未实例化纯虚方法.这将在以后完成,当隐藏部分Child的ctor将工作.ctor的这个隐藏部分修改了对象的VMT(虚方法表).类似的故事发生在一个复杂的物体被摧毁时.可以根据基类链的复杂性多次修改VMT.