-1

我寫了一段代碼,其中有一個抽象基類。 Tiger和Class Lion幾乎都是從Animal Base Class繼承而來的。獅子從獅子和老虎繼承。當我嘗試創建一個Liger對象並訪問漫遊功能時,出現「模糊訪問步行」錯誤。我已經使用虛擬繼承來避免鑽石問題。任何人都可以幫助我解決這個問題。在抽象類中克服鑽石含糊不清

#include "stdafx.h" 
#include <iostream> 
using namespace std; 
class Animal 
{ 
public: 
    virtual void walk() = 0; 

}; 
class Lion : virtual public Animal 
{ 
public: 
    void walk() 
    { 
     cout<<"Animal Walking"<<endl; 
    } 
}; 
class Tiger : virtual public Animal 
{ 
public: 
    void walk() 
    { 
     cout<<"Animal Walking"<<endl; 
    } 
}; 
class Liger : public Lion , public Tiger 
{ 
public: 

}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Liger lig; 
    lig.walk(); 
    return 0; 
} 
+0

您從未爲'Liger'定義'walk'函數。 – NathanOliver

回答

1

由於您有2個方法具有相同的定義,編譯器不知道使用哪個方法。你可以明確地告訴編譯器使用哪個。例如,這使用從Tiger定義:

lig.Tiger::walk(); 

不幸的是,給定的程序仍在畸形:

你根本不允許有一種情況,即虛擬 函數有不止一個最終在您的程序中存在 的任何派生類中的覆蓋。

this answer對於類似的問題。

或者,您可以在Liger類中爲walk()提供一個定義,該類還允許您調用派生函數中的任意一個。這裏給出的示例修改爲使用此工作:

​​
+0

既然你有一個實際的'Liger','liger.walk()'[will complie](http://coliru.stacked-crooked.com/a/13f83616bc7e032d) – NathanOliver