2013-05-27 126 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'需要一個默認的構造函數。 **或**你需要添加一個構造函數到調用'A'構造函數的'D'。 –

回答

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)'會阻止這種情況。無論虛擬繼承如何,所有類都是如此。 –