【问题标题】:Composition of derived classes派生类的组成
【发布时间】:2014-07-09 06:51:36
【问题描述】:

我有一个关于 C++ 中的组合和继承的问题:

我有一个基类'A' 和一个派生类'B''B''A' 继承成员),是否可以通过组合将'B' 用作'A' 的成员?

【问题讨论】:

  • 不可能,因为A 需要知道B 的大小,其中包含A,其中包含B,其中....
  • 这是假设的,对吧?您没有真正要解决的问题,是吗?
  • 是的,我只是在问。因此,如果我将创建派生自'A' 并具有成员'B' 的类'C',这是可能的,对吧?
  • @Medvednic 对。在这种情况下,您将有两个 A 实例,而不是无限的。
  • 是的,您的C : A { B b; }; 是合理的。

标签: c++ class oop inheritance composition


【解决方案1】:

关于“A 有 B 成员,B 派生自 A”:实际上,您不能声明这样的事情。如果类 A 有 B 类型的成员,则 B 需要在 A 之前声明。如果 B 使用 A 作为基类,则 A 必须在 B 之前声明。

关于组合,如果你想做这样的事情,你可能不得不使用间接(指针、智能指针等)。

class B;
class A {
  B *b;
};
class B : public A {
};

有人可能会争辩说(在 C++ 中)使用指针不是组合;但是,在 Java 中,所有对象都是“指针”,因此组合是:

class A {
  B b;
}
class B extends A {
}

【讨论】:

    【解决方案2】:

    但是,您可以嵌入 B* 字段。因此const B& 也应该是可能的,并且表现得像B(请注意,我现在是一名沙盒 Java 程序员。)

    class B;
    class A {
        B& b;
    };
    

    顺便说一句,您甚至可能不会在 A 中嵌入 A。

    【讨论】:

    • 你仍然会有无尽的递归。您可以将A::my_b 转换为A,访问其my_b,将其转换为A...
    • @DrewDormann 这实际上不是问题:链表的结构类似。只知道何时停止递归。
    • @Quentin 在这个答案中使用 reference variable 会导致无限递归。出于同样的原因,链表不使用引用作为它们的链接。没有 NULL,没有“停止递归”机制。
    • 为什么要有这样的“停止回避”机制? This example 有效。由于 OP 没有说明为什么他们想要这个字段,所以不能排除这种使用是不可能的。
    • 引用 B& 存储为 B*: sizeof(B&) == sizeof(B*)。这样的引用指针在使用时会自动取消引用。 @DrewDormann:对吗?
    猜你喜欢
    • 1970-01-01
    • 2017-12-02
    • 2018-11-30
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 2012-03-05
    相关资源
    最近更新 更多