【发布时间】:2019-11-13 03:11:33
【问题描述】:
我在C++有以下程序:
class A {
public :
A(){
cout << "A::A()" << endl;
}
A( int x){
cout << "A::A(int)" << endl;
}
};
class B : public A {
public :
B(){
cout << "B::B()" << endl;
}
B( int x){
cout << "B::B(int)" << endl;
}
};
class C : public virtual B {
public :
C(){
cout << "C::C()" << endl;
}
C( int x){
cout << "C::C(int)" << endl;
}
};
class D : public B {
public :
D(){
cout << "D::D()" << endl;
}
D( int x) : B(x){
cout << "D::D(int)" << endl;
}
};
class E : public C, public virtual
D, public virtual B {
public :
E(){
cout << "E::E()" << endl;
}
E( int x) : D(x){
cout << "E::E(int)" << endl;
}
};
int main() {
E(5);
return 0;
}
我正在尝试了解将要打印的内容。我将尝试解释我如何看待这种情况。首先我们打电话给E(5)。在E(int) 构造函数中,我们有以下语法:E(int x) : D(x) 然后应该调用D(x) 构造函数(而不是继承类class E : public C, public virtual D, public virtual B 的构造函数,这意味着只有D(x) 应该在没有C(),D(),B() 的情况下调用) .在D 类中,我们需要调用B()。这部分我不明白 - 我们调用了 D(int) 构造函数,它也有语法:D(int x) : B(x) 所以应该调用 B(x) 而不是 B()。如果我们需要使用B()构造函数即使调用构造函数B(x)而不是为什么当我们调用E(5)构造函数时我们没有执行E()。
现在,我接受应该首先调用B()。然后我们调用A() 构造函数并执行它,然后调用B()。当我们到达D(x) 时,我们调用B(x) 然后A() 所以直到现在我们打印:
A::A()
B::B()
A::()
B::B(int)
D::D(int)
现在我们需要回到E(5) 并执行它,但由于某种原因,C() 构造函数被调用,我不明白为什么。我们说过,如果我们有E(int x) : D(x) 语法,那么我们只执行D(x)。在这些问题中要遵循哪些规则/算法?
编辑: 预期输出:
A::A()
B::B()
A::A()
B::B(int)
D::D(int)
C::C()
E::E(int)
我的观点:
A::A() // not fully agree
B::B() // not fully agree
A::A()
B::B(int)
D::D(int)
E::E(int)
【问题讨论】:
-
请包括你在运行程序时得到的实际输出,以及你认为应该得到的输出。我还建议您使用调试器来单步执行代码。
-
@Someprogrammerdude 我已经添加了预期的输出以及我认为应该如何。我尝试使用调试器(这就是我看到它进入
C()的方式)。 -
如果标准对您来说太枯燥,请阅读 cppreference.com。
-
我得到了预期的输出。我不确定你为什么从你的角度得到输出——尤其是为什么
C没有被构造。 -
@Eljay 我认为“预期”意味着“实际发生的事情”,“从我的角度来看”意味着“我所期望的”。 (也就是说,几乎与您的预期相反。)
标签: c++ inheritance constructor virtual multiple-inheritance