📜  警告:base 将在之后初始化 - C++ (1)

📅  最后修改于: 2023-12-03 15:11:58.264000             🧑  作者: Mango

警告:base 将在之后初始化 - C++

在 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” 是一个非常重要的警告,如果被忽略,可能会导致程序的异常行为。如果你遇到这个警告,请尝试重新安排继承顺序,确保基类在子类之前被初始化。