2013-09-25 5 views
1

Я пытаюсь понять решение проблемы алмаза (множественное наследование) в C++.Алмазный код наследования в C++ не работает должным образом

Я написал этот код, чтобы лучше понять решение, но он не ведет себя так, как ожидалось.

#include <stdio.h> 

class A 
{ 
public: 
    void Print() 
    { 
     printf("A\n"); 
    } 
}; 

class B : virtual public A 
{ 
public: 
    void Print() 
    { 
     printf("B\n"); 
    } 
}; 

class C : virtual public A 
{ 
public: 
    void Print() 
    { 
     printf("C\n"); 
    } 
}; 

class D : public B, public C 
{ 
}; 

int main() 
{ 
    D d; 
    d.Print(); 
} 

Visual Studio 2008 Express Edition вопит: ошибка C2385: неоднозначное доступ 'Print' 1> может быть 'Печать' в базе 'B' 1> или может быть 'Печать' в база 'C' ошибка C3861: 'Печать': идентификатор не найден

Может ли кто-нибудь рассказать мне, что мне здесь не хватает?

+0

Если возможно, обновите до последней версии Visual Studio 2013 – TemplateRex

ответ

1

Какая версия Print() должна d.Print() позвонить? Есть два варианта. Вы можете выбрать, хотя:

d.A::Print(); // this one isn't part of the overload set search without qualification 
d.B::Print(); 
d.C::Print(); 

Обратите внимание, что делает A::Print() в virtual функцию не поможет, так как не существует единого окончательное переопределение функции. Вам нужно явно переопределить Print() в D.

+0

Пример, который я последовал (http://www.programmerinterview.com/index.php/c-cplusplus/diamond-problem), предположил, что наследование B и C virtual решит проблему ... – conectionist