【发布时间】:2015-10-13 04:30:05
【问题描述】:
以下代码:
#include <iostream>
struct A {
int a;
virtual int foo(){ std::cout << "foo()" << std::endl; return 5; }
A(int a) : a(a){ }
};
struct B : A{
B() : A(foo()){ }
};
int main()
{
B b;
}
产生一个警告
warning: base class 'A' is uninitialized when used here to access 'A::foo'
这是否意味着在未初始化时访问基类会产生Undefined Behavior?
在我的例子中,A::a 得到了 5 的值,这没关系。
【问题讨论】:
-
如果
foo访问A的任何成员变量(现在可能不存在但以后可能存在),那么您可以获得未定义的行为。如果foo变成了一个虚函数,或者调用了一个虚函数,可以得到非常惊人的结果。 -
当我们将 'a' 设为 A::a 的静态变量时会发生什么?
-
@vishal 程序将不再编译,因为静态成员不能在构造函数初始化列表中列出。
-
感谢您的知识:)
标签: c++ class initialization