c++ - 多重继承和虚拟继承 C++

标签 c++ multiple-inheritance virtual-inheritance

完全免责声明,这是家庭作业 - 没有评分,只是给学生,所以我们可以练习。
我正在寻求帮助,因为我们不会得到答案,我只想知道如何解决它。

我能做的是定义结构 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/

相关文章:

c++ - 如何克隆多个继承对象?

go - Go中如何实现虚继承

c++ - 如何将 std::function 作为参数传递给 gmock 中的模拟方法?

c++ -::没有命名空间

C++:在派生类的对象上调用函数的函数调用优先级规则?

oop - 多重继承 : What's a good example?

C++ 虚拟继承

C++:继承同名的重载非虚方法和虚方法会导致问题

c++ - regex_match (""8 秒,regex (".{40000}"));?

c++方法有时会返回意外的高值