【发布时间】:2020-03-26 16:01:50
【问题描述】:
完全免责声明,这是家庭作业 - 没有评分,只是给学生,以便我们练习。 我正在寻求帮助,因为我们不会得到答案,我只想知道如何解决它。
我能做的是定义结构 B 和 C。它们的接口必须“像 A 的接口,经过修改才能正常工作”。 我无法添加任何新方法。我也无法更改 struct 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()。
我只是想了解这应该如何工作,但如果您仍然不想帮助我解决问题,请给我一些提示。
【问题讨论】:
-
为什么这是所需的输出?它看起来像太多的基类。我不确定这是否可以在最后没有
struct D的情况下完成:wandbox.org/permlink/Eva3gAp2Je0Unt00 -
fwiw,我从字里行间读到你认为询问有关家庭作业的问题本身是不好的。恕我直言,情况并非如此。只是关于作业的问题通常只是作业的转储,没有任何 OP 的努力证明,这就是它们经常被关闭和/或否决的原因,作业是让您学习并要求其他人提供完整的解决方案甚至不尝试任何事情都会浪费这个机会,但是仅仅做家庭作业并不是问题在任何意义上都不好的理由。
-
有关家庭作业问题的更多指导请参见此处:meta.stackoverflow.com/a/334823/4117728。
-
@Yksisarvinen 老实说,我不确定为什么这是我们想要的输出——我的意思是,这正是我们的老师提供给我们的,我们要做的就是在不改变任何东西的情况下编写更多代码他给了我们,所以我们可以得到那个输出。这可能没有意义,但这只是为了练习。我想可以写更多的结构,但我不确定。根据您发送的具有结构 D 的代码,我这样做了:wandbox.org/permlink/PhjPatJJLQDHqxx1,它提供了所需的输出,但我不得不使用另一个新结构。
-
@Yksisarvinen 另外,您确定不添加新结构就无法完成吗?有什么办法可以尝试更改代码,以免收到警告?
标签: c++ multiple-inheritance virtual-inheritance