C++ 从父级调用子函数

Nox*_*Nox -3 c++ class

我试图从父级调用一个覆盖函数,发现它只是崩溃了。

这很难描述,所以这里是最小的可重现代码:

#include <iostream>

class A
{
public:
    A()
    {
        init1();
    }
    
    void init1()
    {
        printf("1");
        init2();
        printf("2");
    }

    virtual void init2() = 0;
};

class B : public A
{
public:
    B()
    : A()
    {}

    void init2() override
    {
        printf("hello");
    }
};

int main()
{
    B b;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在 MSVC 2019 上它崩溃了,在http://cpp.sh/ 上它输出“1”然后main()返回 0,但我们从未看到"hello""2"

  1. 为什么会崩溃?从低层次的角度来看会发生什么?是A试图调用它自己的init2()吗?

  2. 有没有办法做到这一点,所以我不必在每个派生类中添加init2()其构造函数?

Rem*_*eau 7

您不能从基类构造函数(或析构函数)中调用派生类的重写方法。对象的派生类部分尚不存在。

所以,回答你的问题:

  1. yesA::A()正在尝试调用A::init2(), not B::init2(),因此因调用纯虚方法而崩溃。

  2. 基类构造函数有多种方法(如通过CRTP)调用派生类方法,但这样做有其局限性(即,无法访问任何派生类数据成员,因为它们还不存在,只有可以访问基类数据成员)。在你的榜样,B::init2()不访问任何B数据成员,所以这是有可能A::A()调用B::init2(),但一般而言,您真的需要等待B开始/结束构造本身,你可以安全地调用之前B::init2()