📅  最后修改于: 2023-12-03 15:11:58.264000             🧑  作者: Mango
在 C++ 编程中,你可能会接收到一个警告:warning: base will be initialized after
。这意味着在代码中,你尝试初始化一个基类,但该基类却在子类之后被初始化了。
这个警告是编译器试图保护你免受预期外的行为的警告。如果在子类初始化之前,基类需要先被初始化,否则你的程序可能会出现异常行为。
修复此警告的方法是改变类的继承顺序。
例如,在下面的示例中:
class A {
public:
A() {}
};
class B : public A {
public:
B() {}
};
class C : public B {
public:
C() {}
};
在此示例中,B 继承自 A,C 继承自 B,如果在 C 构造函数中使用 A 的成员,则可能会触发警告。
C::C() : A(), B() {} // NO: base A will be initialized after C
相反,这种结构应该被重组为以下形式,以确保 A 的初始化发生在 B 和 C 之前:
class A {
public:
A() {}
};
class B : public virtual A { // note the virtual keyword
public:
B() {}
};
class C : public virtual B { // note the virtual keyword
public:
C() {}
};
这将确保基类 A 在任何派生类之前被初始化。
警告:“base will be initialized after” 是一个非常重要的警告,如果被忽略,可能会导致程序的异常行为。如果你遇到这个警告,请尝试重新安排继承顺序,确保基类在子类之前被初始化。