为什么我的覆盖方法没有被调用?

Bri*_*din 1 c++ inheritance

可能是一个简单的问题.我注意到了一些类似的问题,但它们似乎都没有解决我的问题,因此我的帖子.

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

Kir*_*lev 5

从基类的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.