2016-01-06 60 views
0

我在C新型++和解決鑽石問題時,我吮吸解決這個問題: 這裏的代碼:鑽石的問題時嘗試使用虛擬繼承

#include <iostream> 

using namespace std; 

// Base class 
class Base 
{ 
    public: 
     virtual void getArea() 
     { 
     cout << "Called by Base\n"; 
     } 
}; 

// Derived class 
class Rectangle: public virtual Base 
{ 
    public: 
     void getArea() 
     { 
     cout << "Called by Rectangle\n"; 
     } 
}; 

// Derived class 
class Square: public virtual Base 
{ 
    public: 
     void getArea() 
     { 
     cout << "Called by Square\n"; 
     } 
}; 

// Derived class 
class Triangle: public Rectangle, Square 
{ 
    public: 
     void blabla(){} 
}; 

int main(void) 
{ 
    Triangle Tri; 
    Tri.getArea(); 

    return 0; 
} 

我得到了G ++錯誤:

main.cpp:36:7: error: no unique final overrider for ‘virtual void Base::getArea()’ in ‘Triangle’ 
class Triangle: public Rectangle, Square 
    ^
main.cpp: In function ‘int main()’: 
main.cpp:45:6: error: request for member ‘getArea’ is ambiguous 
    Tri.getArea(); 
    ^
main.cpp:29:12: note: candidates are: virtual void Square::getArea() 
     void getArea() 
      ^
main.cpp:19:12: note:     virtual void Rectangle::getArea() 
     void getArea() 

我在互聯網上發現,虛擬繼承解決了問題那麼,我的錯誤是什麼。

在此先感謝

回答

0

看成是一個編譯器:你應該叫什麼方法?

你有一個三角形是一個正方形和一個矩形,你問的是區域。如果您的三角形選擇使用Rectangle.getArea()Square.getArea()

編譯器無法知道。這裏的一個解決方案是在此改變的getArea()方法,例如:

class Triangle: public Rectangle, Square 
{ 
    public: 
     void blabla(){} 
     void getArea() 
     { 
     Square::getArea; //I'm a square 
     Rectange::getArea; //I'm a rectangle 
     } 
}; 

這個問題將甚至可以觸發是沒有階級基礎。在使用菱形繼承的個例是這樣的:

class Base 
{ 
    protected: 
     int x; 
}; 


class Derived1: virtual public Base 
{ 
    //some stuff 
}; 


class Derived2: virtual public Base 
{ 
    //some stuff 
}; 


class Join: public Derived1, public Derived2 
{ 
    int getX(){ 
    return x; 
    } 
}; 

在這裏,使用虛擬繼承允許我們只有基類的一個實例中的連接實例,而不是2沒有和上一個錯誤應該選擇x。

0

你的問題是你有兩個不同的類在同一級別的繼承提供了不同的虛擬方法覆蓋。編譯器無法知道哪一個應該優先,所以你需要提供你自己的覆蓋,並做你想做的任何事情(調用其中任何一個函數,或者推出你自己的實現)。