Я новичок в наследовании в C ++ и решил попробовать несколько экспериментов, чтобы узнать об этом предмете.
Код ниже показывает иерархию классов, которые я создаю:
classes.h
class base
{
protected:
int _a;
int _b;
int _c;;
base(int b, int c);
};
class sub_one : public virtual base
{
public:
sub_one(int a, int b) : base(a, b)
{
// do some other things here
}
// other members
};class sub_two : public virtual base
{
protected:
int _d;
public:
sub_two(int a, int b, int c = 0) : base(a, b)
{
// do something
}
// other members
};class sub_three : public sub_one, public sub_two
{
private:
bool flag;
public:
sub_three(int a, int b, int c = 0) : base(a, b)
{
// do something
}
};
classes.c
base::base(int a, int b)
{
// ...
}
Компилятор показывает мне сообщения:
нет соответствующей функции для вызова sub_one :: sub_one ()
нет соответствующей функции для вызова sub_one :: sub_one ()
нет соответствующей функции для вызова sub_two :: sub_two ()
нет соответствующей функции для вызова sub_two :: sub_two ()
Я просто не могу понять, что не так.
sub_three(int a, int b, int c = 0) : base(a, b)
{
// do something
}
эквивалентно:
sub_three(int a, int b, int c = 0) : base(a, b), sub_one(), sub_two()
{
// do something
}
Поскольку таких конструкторов в sub_one
а также sub_two
Компилятор сообщает об ошибках. Вы можете добавить конструкторы по умолчанию в sub_one
а также sub_two
убрать ошибки.
sub_three
конструктор инициализирует base
и вызвать конструктор по умолчанию sub_one
а также sub_two
который не существует, вам может понадобиться
class sub_three : public sub_one, public sub_two
{
private:
bool flag;
public:
sub_three(int a, int b, int c = 0)
: base(a, b), sub_one(a,b), sub_two(a,b,c), flag(false)
{
// do something
}
};