【问题标题】:Flawed inheritance when children classes need to include each other in c++当子类需要在 C++ 中相互包含时的有缺陷的继承
【发布时间】:2019-12-17 17:17:24
【问题描述】:

假设我有一个 A 类。B 类和 C 类都是 A 的子类。 如果类 C 需要包含 B,这会是一个有缺陷的继承设计吗?

编辑:一个例子

假设我有一个名为 Trip 的父类,它有两个属性:start 和 end。我从 A 继承的第一个类 (B) 称为 SimpleTrip,它有一个称为传输的附加属性(因此总共:开始、结束和传输)。我从 A 继承的第二个类 (C) 称为 CompoundTrip,它有两个添加的属性,一个 SimpleTrips 数组和一些行程(所以总共:开始、结束、SimpleTrips 数组、行程数)。复合旅行是简单旅行的“组”,但仍然是一次旅行。

【问题讨论】:

  • 这取决于您所说的“需要包含 B” - 如果 C 类需要 B 类拥有的 所有内容,那么让 C 类派生自 ( = 的孩子?) B 类。
  • 对我来说似乎很安全,但是......除非有我不考虑的特殊情况,否则我认为不需要 B B 将只是一个 C 与一条腿和一条腿不会被认为是一次旅行。这可能会完全消除继承。
  • 您的示例似乎与复合设计模式所期望的相似。

标签: c++ inheritance include children


【解决方案1】:

看看这个并尝试在不运行程序的情况下回答“c.a() 打印什么”,然后尝试运行它。

#include <iostream>

struct A {
    virtual void a() {
        std::cout << "a" << std::endl;   
    }
};

struct B : A {
    virtual void a() override {
        std::cout << "b" << std::endl;
    };
};

struct C : A, B {
};

int main() {
    C c;
    c.a();
}

https://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem

【讨论】:

  • 很快就回答了。这个问题不涉及钻石。此后,Asker 确认 BC 之间存在包含关系而不是 is-a 关系。
  • 啊没看到!好吧,无论如何,让我们留下答案,以防其他人偶然发现此线程 x)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多