2013-07-12 2 views
0

я получаю 2 комплекта ошибок при попытке построить:ошибка наследования класса?

(на первой сборки)

In constructor 'aa::aa(int)': 
no matching function for call to 'bb:bb()' 
candidates are: bb::bb(int) 
bb:bb(const bb&) 

(тогда я ударил построить снова и получить следующее)

file not recognized: File truncated... takes me to assembly 
collect2:ld returned 1 exit status 

#ifndef BB_H 
#define BB_H 

class bb 
{ 
public: 
    bb(int _m); 
    int m; 
}; 

#endif // BB_H 

#ifndef AA_H 
#define AA_H 
#include "AA/bb.h" 

class aa : bb 
{ 

public: 
    aa(int _i); 

    int i; 
    int j; 
}; 

#endif // AA_H 

#include "bb.h" 

bb::bb(int _m) 
{ 
    m = _m * 5; 
} 

#include "aa.h" 

aa::aa(int _i) 
{ 
    i = _i; 
    j = i + 1; 
} 
+2

Для инициализации базы данных вам нужно использовать список инициализаторов. Это должно быть рассмотрено в любом учебнике или наследовании. – chris

+0

Если вы не понимаете, о чем говорит крис: производный конструктор вызовет базовый класс default construtor 'bb: bb()'. Поскольку вы не указали 'bb: bb()', он не может построить объект 'aa' (он не знает, как построить его базу).Однако вы можете указать, что 'aa :: aa (int)' должен использовать 'bb :: bb (int)': aa: aa (int _i): bb (_i) {/ * ... * /} '. Подробности можно найти в любой достойной книге. – Zeta

ответ

3
In constructor 'aa::aa(int)': 
no matching function for call to 'bb:bb()' 

право составителя. У вас нет конструктора по умолчанию. Несмотря на то, что компилятор напишет для вас конструктор по умолчанию, если вы его не пишете, это не произойдет, если у вас есть любые пользовательские конструкторы.

У вас есть 2 варианта:

Во-первых, реализовать конструктор по умолчанию:

class bb 
{ 
public: 
    bb(int _m); 
    bb(); 
    int m; 
}; 

bb:bb() 
{ 
} 

Это может быть полная, потому что, как вы будете инициализировать m?

Во-вторых, вызвать конструктор новообращенного в конструкторе aa «s, используя список инициализации: конструктор класса

aa::aa(int _i) 
: 
    bb (_i) 
{ 
    i = _i; 
    j = i + 1; 
} 
0

Base вызывается при создании объекта производного класса.
В вашем примере вы должны создать объект класса aa, так как класс bb является его базовым классом, компилятор ищет конструктор по умолчанию для класса bb. Поскольку вы создали параметризованный конструктор, он не будет использовать конструктор по умолчанию, приводящий к ошибке
Совпадений для вызова функции bb().
Чтобы преодолеть эту ошибку либо предоставить конструктор по умолчанию в классе бб как

bb::bb() 
    { 
    } 

или

В списке инициализации конструктора аа просто дать вызов класса бб параметризированного конструктор как ниже

aa::aa(int i):bb(int x) 
    { 
    } 


Что я здесь делал, я только что инициализировал элементы данных базового класса до инициализации элементов данных производного класса, а компилятор ожидает того же.

Смежные вопросы