这个程序的输出为什么class C
#include <iostream>
#include<iomanip>
using namespace std;
class A {
public:A(const char* s) {
cout << s << endl;
}
};
class B :public virtual A {
public:
B(const char* s1, const char* s2) :A(s1) { cout << s2 << endl; }
};
class C :public virtual A {
public:
C(const char* s1, const char* s2) :A(s1) { cout << s2 << endl; }
};
class D :public B, C {
public:
D(const char* s1, const char* s2, const char* s3, const char* s4) :B(s1, s2), C(s3, s4), A(s1)
{
cout << s4 << endl;
}
};
int main() {
D d("class A", "class B", "class C", "class D");
}
BC虚继承 A 所以 构造 BC时都不会构造 A ,所以通过 C 传递给 A的 class C 不会打印出来,B也是一样,只有直接通过 D构造的A 才会打印
如果有用 麻烦给个采纳 谢谢
输出是
class A
class B
class D
class D
这段程序会输出 "class C" 而不是 "class B" 或 "class A" 是因为它涉及到了多态性和虚函数的概念。
在这段代码中,类A是基类,类B是A的派生类,类C又是B的派生类。类A中的foo()函数被声明为虚函数,这意味着它可以由派生类进行重写。
在main函数中,创建了一个指向B类对象的指针obj,并将其初始化为指向C类的对象。由于类C是类B的派生类,所以可以将C类对象指针赋值给B类的指针。
当调用obj->foo()函数时,由于foo()函数在类B中被声明为虚函数,程序会根据指针所指向的对象类型来确定要调用的函数。在这种情况下,指针obj所指向的对象是类C的对象,因此会调用类C中重写的foo()函数。
因此,最终输出的是 "class C"。