【问题标题】:Multiple inheritance with one base class一个基类的多重继承
【发布时间】:2015-03-10 16:36:58
【问题描述】:

(删除原始文本,因为它与已回答的当前问题无关。请参阅修订。)

这是我的示例test.hpp(简化):

class House {
    private:
        int nWindows;
    public:
        House(int nWindows);
        int getNumberOfWindows();
};

class PaintedHouse : public virtual House {
    private:
        int colorCode;
    public:
        PaintedHouse(int nWindows, int colorCode);
        int getColorCode();
};

class OccupiedHouse : public virtual House {
    private:
        int nPeople;
    public:
        OccupiedHouse(int nWindows, int nPeople);
        int getNumberOfPeople();
};

class PaintedOccupiedHouse : public PaintedHouse, OccupiedHouse {
    public:
        PaintedOccupiedHouse(int nWindows, int colorCode, int nPeople);
};

还有test.cpp:

#include "test.hpp"

House::House(int nWindows) { this->nWindows = nWindows; }
int House::getNumberOfWindows() { return this->nWindows; }

PaintedHouse::PaintedHouse(int nWindows, int colorCode) : House(nWindows) {
    this->colorCode = colorCode;
}
int PaintedHouse::getColorCode() { return this->colorCode; }

OccupiedHouse::OccupiedHouse(int nWindows, int nPeople) : House(nWindows) {
    this->nPeople = nPeople;
}
int OccupiedHouse::getNumberOfPeople() { return this->nPeople; }

PaintedOccupiedHouse::PaintedOccupiedHouse(int nWindows, int colorCode, int nPeople)
            : PaintedHouse(nWindows, colorCode), OccupiedHouse(nWindows, nPeople) {}

GCC 返回:

test.cpp: In constructor ‘PaintedOccupiedHouse::PaintedOccupiedHouse(int, int, int)’:
test.cpp:18:72: error: no matching function for call to ‘House::House()’
    : PaintedHouse(nWindows, colorCode), OccupiedHouse(nWindows, nPeople) {}
                                                                        ^
test.cpp:18:72: note: candidates are:
test.cpp:4:1: note: House::House(int)
 House::House(int nWindows) { this->nWindows = nWindows; }
 ^
test.cpp:4:1: note:   candidate expects 1 argument, 0 provided
In file included from test.cpp:2:0:
test.hpp:2:7: note: constexpr House::House(const House&)
 class House {
       ^
test.hpp:2:7: note:   candidate expects 1 argument, 0 provided
test.hpp:2:7: note: constexpr House::House(House&&)
test.hpp:2:7: note:   candidate expects 1 argument, 0 provided

你能告诉我我做错了什么吗?一般概念是否正确?

【问题讨论】:

  • 如果这是出于娱乐目的,可以。但出于各种原因,我强烈建议避免此类继承方案。
  • 在我看来,您的教授希望您探索虚拟基类问题 - 给出的名称非常暗示您绘制的钻石类型。
  • @Elemental 我没有使用虚拟基类的经验...我所有尝试使用这些都失败了:(
  • @justlerning,也许发布您的无法编译的代码以及相关的编译器错误会很有用。
  • @justlerning 当时似乎是一项有用的任务。这当然是可能的。 (虽然这个菱形在 c++ 中可能是一个问题,但许多大型代码库都使用这种结构)

标签: c++ inheritance multiple-inheritance


【解决方案1】:

我建议将Painting 和Occupied 的东西分成不同的类。 因此,您可以:

Painted    House   Occupied
   |         |        | 
   +---------+--------+  
             |  
  Painted_Occupied_House  

最好不要设置可怕的钻石继承。看看你是否可以重构来缓解这个问题。

金刚石界面带来了注入更多缺陷的可能性。

【讨论】:

  • 来自 JAVA 背景,我同意你的看法(尽管每个 JAVA 开发人员显然都讨厌多重继承)。但是,类名(及其隐含的特性)是固定的,所以我无法重构任何东西。无论如何,谢谢你的建议!
【解决方案2】:

替换

PaintedOccupiedHouse::PaintedOccupiedHouse(int nWindows, int colorCode, int nPeople)
            : PaintedHouse(nWindows, colorCode), OccupiedHouse(nWindows, nPeople) {}

通过

PaintedOccupiedHouse::PaintedOccupiedHouse(int nWindows, int colorCode, int nPeople)
            : House(nWindows), PaintedHouse(nWindows, colorCode), OccupiedHouse(nWindows, nPeople) {}

当您有虚拟继承时,virtual 基类只有一个实例。它必须在正在构造的最派生类的构造函数中初始化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多