我不明白为什么这个程序的输出结果是这样的。为什么没有编译错误?我认为当尝试构造B时,编译器会找不到名为foo()的函数并报告一个错误。
#include <iostream>
using namespace std;
struct A{
int a;
A(int i=0) : a(i) { cout << "A" << endl; }
~A() { cout << "Bye A" << endl; }
int foo() { return a; }
};
struct B{
int b;
B(int i=0) : b(i) { cout << "B" << endl; }
~B() { cout << "Bye B" << endl; }
int bar() { return b; }
};
struct C : B, A {
C(int i=0) : B(foo()), A(i) {}
};
int main() {
cout << C(10).bar() << endl;
return 0;
}
输出:
B
A
0
Bye A
Bye B
通常情况下,我想知道在存在多重继承时,父结构体的构造和初始化顺序是什么?在类中可以期待类似的行为吗?
对于构造函数和析构函数调用顺序的任何解释都将不胜感激。
注意:这不是作业。我已经查找了类似的主题,但没有关于这个问题的结果。
struct
也声明了一个类。)因此,我希望它们的行为方式相同。 - HolyBlackCatfoo
是C
可访问、明确的基类成员,那么问题在哪里呢? - Kerrek SBA::A
之前调用A::foo
。这将返回一个未初始化的A::a
。 - MSalters