gpt4 book ai didi

c++ - 从基类构造函数调用派生类的成员函数

转载 作者:搜寻专家 更新时间:2023-10-31 00:33:19 25 4
gpt4 key购买 nike

假设我有

struct C {
C() { init(); };
void init() { cout << "C" << endl; };
};

struct D : public C {
D() : C() { };
void init() { cout << "D" << endl; }
};

D();

为什么我打印的是“C”?如何改变这种行为(并获得“D”)。

如果我两个都想要怎么办?

最佳答案

why I get "C" printed?

C::init() 未声明为 virtual,因此 D 无法覆盖它。但即使 C::init() 被声明为 virtualD::init() 仍然C 的构造函数中调用 init() 时不会被调用。

C++ 在派生类之前构造基类(并在基类之前析构派生类)。所以 C 的构造函数在构造 D 之前运行(而 C 的析构函数在 D 析构之后运行) .当C被构造/析构时,被构造/析构对象的VMT根本不指向D的方法表,它指向C 的方法表。

How can change this behaviour (and get "D").

不能从基类构造函数/析构函数内部调用派生虚方法。在这些阶段,VMT 不包含指向派生类方法表的指针。

关于c++ - 从基类构造函数调用派生类的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29021565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com