Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
130 views
in Technique[技术] by (71.8m points)

c++ - Multiple inheritance with one base class

(Removed original text as it is unrelated to the current question which has already been answered. See revisions.)

Here is my example test.hpp (simplified):

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);
};

And 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 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

Could you give me any advice what I am doing wrong? Is the general concept correct?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Replace

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

by

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

When you have virtual inheritance, there is only one instance of the virtual base class. It must be initialized in the constructor of the most derived class being constructed.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...