2013-05-27 2 views
0

Это код обозревают проблемы алмазов дерева множественного наследования и по мне этот код круто, но он показывает некоторые ошибки компиляции на ..help меня, чтобы понять ошибкуПочему выход показывает ошибки

#include<iostream> 
using namespace std; 

class A //A Diamond tree problem 
{ 
    int x; 
public: 
    A(int i) { x = i; } 
    void print() { cout << x; } 
}; 

class B: virtual public A 
{ 
public: 
    B():A(10) { } 
}; 

class C: virtual public A 
{ 
public: 
    C():A(20) { } 
}; 

class D: public B, public C{ 
}; 

int main() 
{ 
    D d; 
    d.print(); 
    return 0; 
} 
+8

Какая ошибка вы получаете? –

+0

Это дает ошибку, потому что 'A' должен иметь конструктор по умолчанию. ** Или ** вам нужно добавить конструктор в 'D', который вызывает конструктор' A'. –

ответ

3

Вам необходимо предоставить по умолчанию для построения D и вызова в элементе инициализации списка:

class D: public B, public C{ 
public: 
    D():A(30){} 
}; 

Или вы могли бы предоставить по умолчанию конструктор

A():x(0) {} 
8

Было бы полезно, чтобы увидеть ошибку:

In constructor ‘D::D()’: 
error: no matching function for call to ‘A::A()’ 

При использовании виртуального наследования базового класса виртуальной должен быть инициализирован самым производным классом. В этом случае это D; поэтому для того, чтобы иметь возможность создать экземпляр D, он должен инициализирует A:

class D: public B, public C 
{ 
public: 
    D():A(42) {} 
}; 

В качестве альтернативы, вы можете предоставить A с конструктором по умолчанию. Объявление любого конструктора не позволит компилятору неявно генерировать его для вас.

+0

Можете ли вы объяснить немного больше? Разве компилятор не предоставил конструктор по умолчанию? это конкретное поведение виртуального наследования – sethi

+0

@bapusethi: вы получаете только неявный конструктор по умолчанию, если не объявляете никаких собственных конструкторов. Объявление 'A (int)' предотвратит это. Это верно для всех классов, независимо от виртуального наследования. –

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