完全免责声明,这是家庭作业 - 没有评分,只是给学生,所以我们可以练习。
我正在寻求帮助,因为我们不会得到答案,我只想知道如何解决它。
我能做的是定义结构 B 和 C。它们的接口(interface)必须“像 A 的接口(interface),经过修改才能正常工作”。
我无法添加任何新方法。我也无法更改结构 A 中的任何内容。
这是代码:
#include <iostream>
struct A;
struct B;
struct C;
struct A {
A() {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
};
int main(){
C c;
}
所需的输出是:
A::A()
A::A()
B::B()
A::A()
A::A()
B::B()
A::A()
C::C()
到目前为止我试图做的事情:
首先我是这样开始的,只是为了检查一下:
struct B : public A {
B() : A() {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
};
struct C : public B {
C() : B() {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
};
这给了我:
A::A()
B::B()
C::C()
所以我尝试先获得 C,然后是 A,然后是 B,然后是 A(从底部获得所需的输出):
struct B : public virtual A {
B() : A() {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
};
struct C : public B, public A {
C() : A(), B() {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
};
但这当然行不通。 (警告:由于歧义,在“C”中无法访问直接基础“A”)
添加如下虚拟关键字从底部再次给了我C,B然后A:
struct B : public virtual A {
B() : A() {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
};
struct C : public virtual A, public B {
C() : A(), B() {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
};
如果我想得到C,那么A我必须做以下(但不会有B)
struct C : public virtual A {
C() : A() {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
};
struct B : public virtual A, public C {
B() : C(), A() {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
};
我也不知道我怎么能连续两次得到 A::A() 。
我只是想了解这应该如何工作,但是如果您仍然不想帮助我解决问题,请给我一些提示。
最佳答案
我没有看到在使用类(class)成员的练习中受到限制:
struct A
{
A() { std::cout << __PRETTY_FUNCTION__ << "\n"; }
};
struct B : A
{
B() { std::cout << __PRETTY_FUNCTION__ << "\n"; }
};
struct C
: B
, A
{
C() { std::cout << __PRETTY_FUNCTION__ << "\n"; }
B b;
A a;
};
更新
自从我发布第一个答案以来,所需的输出已经改变。所以之前的回答就错了。但是现在你明白了——你可以使用合成和复制
A a;
至B
定义和删除 A
继承自 C
定义。
关于c++ - 多重继承和虚拟继承 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60871316/