C++ 基类在被访问时被单元化
以下代码:C++ 基类在被访问时被单元化,c++,class,initialization,C++,Class,Initialization,以下代码: #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; } 这是否意味着在基类未初
#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;
}
这是否意味着在基类未初始化时访问它会产生未定义的行为
在我的例子中,
A::A
得到了值5
,它没有问题。是的,它是未定义的行为(IIRC),因为foo
是一个虚拟方法
如果
foo
不是虚拟的,那么行为将被定义,但是在对象初始化之前调用方法仍然是一个值得怀疑的想法 如果foo
访问A
的任何成员变量(现在可能不存在,但以后可能存在),则可以获得未定义的行为。如果foo
成为一个虚拟函数,或者调用一个虚拟函数,你会得到非常令人惊讶的结果。当我们将“a”作为a::a的静态变量时会发生什么情况?@vishal程序将不再编译,因为静态成员不能列在构造函数初始值设定项列表中。感谢您的知识:)
warning: base class 'A' is uninitialized when used here to access 'A::foo'