一基多继承class
Multiple inheritance with one base class
(删除了原始文本,因为它与已经回答的当前问题无关。请参阅修订。)
这是我的例子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) {}
海湾合作委员会returns:
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
你能告诉我我做错了什么吗?总体概念是否正确?
我建议将 Painting
和 Occupied
的内容分开 类。
因此你可以:
Painted House Occupied
| | |
+---------+--------+
|
Painted_Occupied_House
不想设置可怕的钻石继承。看看你是否可以重构来缓解这个问题。
钻石界面带来了注入更多缺陷的可能性。
替换
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
基础 class 只有一个实例。它必须在正在构造的最派生 class 的构造函数中初始化。
(删除了原始文本,因为它与已经回答的当前问题无关。请参阅修订。)
这是我的例子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) {}
海湾合作委员会returns:
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
你能告诉我我做错了什么吗?总体概念是否正确?
我建议将 Painting
和 Occupied
的内容分开 类。
因此你可以:
Painted House Occupied
| | |
+---------+--------+
|
Painted_Occupied_House
不想设置可怕的钻石继承。看看你是否可以重构来缓解这个问题。
钻石界面带来了注入更多缺陷的可能性。
替换
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
基础 class 只有一个实例。它必须在正在构造的最派生 class 的构造函数中初始化。