-1

Я написал фрагмент кода, где у меня есть абстрактный базовый класс. Класс Tiger и Class Lion фактически наследуются от базового класса животных. Лигер наследует как от Льва, так и от Тигра. Когда я пытаюсь создать объект 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

Вы никогда не определяли функцию 'walk' для' Liger'. – NathanOliver

ответ

1

Поскольку у вас есть 2 метода с тем же определением, компилятор не знает, что использовать. Вы можете явно указать используемому компилятору. Например, это использует определение из Tiger:

lig.Tiger::walk(); 

К сожалению, данная программа еще неверен:

Вы просто не можете иметь ситуацию, в которой виртуальная функция имеет более одного финала overrider в любом производном классе, который существует в вашей программе.

от this answer для подобного вопроса.

В качестве альтернативы вы можете предоставить определение для walk() в классе Liger, что также позволит вам вызвать любую из производных функций. Вот пример, который был изменен для работы:

#include <iostream> 

class Animal 
{ 
public: 
    virtual void walk() = 0; 
}; 

class Lion : virtual public Animal 
{ 
public: 
    void walk() 
    { 
     std::cout << "Lion walking" << std::endl; 
    } 
}; 
class Tiger : virtual public Animal 
{ 
public: 
    void walk() 
    { 
     std::cout << "Tiger walking" << std::endl; 
    } 
}; 

class Liger : public Lion, public Tiger 
{ 
public: 
    void walk() 
    { 
     std::cout << "Liger walking" << std::endl; 
    } 
}; 


int main() 
{ 
    Liger liger; 
    liger.walk(); 

    // Note that you can also access other derived classes' walk functions 
    liger.Tiger::walk(); 

    return 0; 
} 
+0

Поскольку у вас есть фактический 'Liger',' liger.walk() '[будет complie] (http://coliru.stacked-crooked.com/a/13f83616bc7e032d) – NathanOliver

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