【发布时间】: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