2013-02-08 15 views
-3

Я получаю ошибки C2512: «получен»: нет необходимости конструктора по умолчанию доступно ошибки в обоих определениях конструктора полученных классов. Мой код выглядит следующим образом. Как я могу решить эту проблему?C++/MFC множественное наследование вызова конструктора базового класса

Class A 
{ 
    int a, int b; 
    A(int x, int y) 
    { 
     sme code.... 
    } 
} 

Class B 
{ 
    int a, int b, int c; 
    B(int x, int y, int Z) 
    { 
     sme code.... 
    } 
} 


Class derived : public A, public B 
{ 
    derived(int a, int b):A(a, b) 
    { 

    } 

    derived(int a, int b, int c):B(a, b, c) 
    { 

    } 
} 
+2

Попробуйте сделать Конструктор общественности. Кроме того, вы должны как-то инициализировать свою унаследованную копию A * и * B. –

+0

Возможный дубликат [ошибка C2512: нет подходящего конструктора по умолчанию] (http://stackoverflow.com/questions/8689319/error-c2512-no-appro-default-constructor-available) – sashoalm

ответ

1

В обоих классах A и B нет конструктора по умолчанию, необходимо явно инициализировать конструктор A и B в производном конструкторе. Вы не удалось инициализировать A или B конструктор в каждом производном конструктору:

derived(int a, int b):A(a, b), B(a, b, 0) 
           ^^^ 
{ 
} 

derived(int a, int b, int c):A(a, b), B(a, b, c) 
          ^^^ 
{ 
} 
5

Одна из проблем состоит в том, что в каждом из конструктора ваших производных классов вы адресуете соответствующие аргументы конструктора только один из ваших двух базовых классов. Ни один из них не имеет конструктора по умолчанию, поэтому вам нужно явно указать аргументы для построения обоих базовых классов A и B.

Вторая проблема заключается в том, что конструкторы ваших базовых классов неявно объявлены как private, поэтому базовый класс не может получить к ним доступ. Вы должны сделать их либо public, либо не менее protected.

Незначительные проблемы: после определения класса вам нужно положить точку с запятой. Кроме того, ключевым словом для объявления класса является class, а не Class.

class A // <---- Use the "class" keyword 
{ 
public: // <---- Make the constructor accessible to derived classes 
    int a, int b; 
    A(int x, int y) 
    { 
     some code.... 
    } 
}; // <---- Don't forget the semicolon 

class B // <---- Use the "class" keyword 
{ 
public: // <---- Make the constructor accessible to derived classes 
    int a, int b, int c; 
    B(int x, int y, int Z) 
    { 
     sme code.... 
    } 
}; // <---- Don't forget the semicolon 


// Use the "class" keyword 
class derived : public A, public B 
{ 
    derived(int a, int b) : A(a, b), B(a, b, 0) // <---- for instance 
    { 

    } 

    derived(int a, int b, int c) : B(a, b, c), A(a, b) // <---- for instance 
    { 

    } 
}; // <---- Don't forget the semicolon 
+1

+1 адресует обе проблемы. –

0

Ваш первый полученный т е р называет CTOR, но не CTOR B, поэтому компилятор пытается вызвать конструктор по умолчанию B, которая не существует.

То же самое для второй производной CTOR, но переключатель А и В.

Решения: Укажите ctors по умолчанию для A и B.

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