【问题标题】:Multiple and virtual inheritance C++多重继承和虚拟继承 C++
【发布时间】: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


【解决方案1】:

我在练习中没有看到对使用班级成员的限制:

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 定义并从C 定义中删除A 继承。

【讨论】:

  • 我无法添加任何新方法 - 这是提问者所写的
  • @AndreyChernukha,你在哪里看到了任何新方法?
  • 顺便说一句,你不需要继承。
  • 你不能同时继承 C 中的 B 和 A,这不能提供所需的输出 wandbox.org/permlink/Y8P89HRLdnCr6IXY
  • @anastaciu 我认为这是我的错,因为我没有注意到帖子中没有显示所需输出的第一行(由于```A::A())并且我改变了为时已晚。但我已经改变了这个想法,所以它给出了想要的输出。
【解决方案2】:

你可以这样做:

struct B : A { //inherit from A
    B() {
        A();
        std::cout << __PRETTY_FUNCTION__ << "\n";       
    }
};

struct C : B { //inherit from B
    C() {
        B();   //anonymous B object
        A();   //anonymous A object
        std::cout << __PRETTY_FUNCTION__ << "\n";
    }
};

Running sample

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 2014-11-06
    • 2014-10-12
    • 2015-11-21
    • 2010-09-22
    • 2016-03-26
    • 2011-01-08
    相关资源
    最近更新 更多