c++ - 一个基类的多重继承

标签 c++ inheritance multiple-inheritance

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

这是我的示例 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

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

最佳答案

替换

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 基类的实例。它必须在正在构造的最派生类的构造函数中初始化。

关于c++ - 一个基类的多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27910002/

相关文章:

c++ - 将派生类实例作为 void* 传递给 C++ 中的通用回调

c++ - 按标签检查枚举值

c++ - 数组中 4 个数字的总和等于特定数字

c++ - POD 类型的原子位操作

java - 相同的:没有输出

python - 从父类继承的孙子 - Python

c++ - fatal error : Eigen/Dense: No such file or directory

objective-c - 了解何时使用继承来允许一个类使用另一个类的实例

c++ - 继承单例

.net - 是否有允许多个继承行为的 BDD 风格的框架?