0

Я новичок в наследовании на 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()

Я просто не могу понять, что не так.

+0

'sub_three' конструктор инициализирует' base', но забывает, чтобы инициализировать другие два его базовые классы. Ни под 'sub_one', ни' sub_two' не имеют конструкторов по умолчанию, поэтому вам нужно явно их перечислить в списке инициализаторов конструктора sub_three. –

ответ

2
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, чтобы удалить ошибки.

1

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  
    } 
}; 
Смежные вопросы