Следующий код работает отлично:
#include "stdafx.h"
class A1
{
public:
virtual void a1() = 0;
};
class B1 : virtual public A1
{
public:
virtual void b1()
{
A1::a1();
}
};
class A1_Impl : virtual public A1
{
public:
virtual void a1() {}
};
class B_Combined : virtual public A1_Impl/*, virtual public B1*/
{
};
int _tmain(int argc, _TCHAR* argv[])
{
B_Combined b;
return 0;
}
После удаления /*
а также */
компилятор представляет "'B_Combined': inherits 'A1_Impl::A1_Impl::a1' via dominance"
предупреждение. Я думаю, это нормально, потому что я хочу, чтобы B_Combined наследовал реализацию A1::a1
в A1_Impl
(его единственная реализация).
Но я также получаю сообщение об ошибке:
error LNK2001: unresolved external symbol ""public: virtual void __thiscall A1::a1(void)" (?a1@A1@@UAEXXZ)".
Я немного запутался по этому поводу. Почему не работает реализация в A1_Impl? Вывод B_Combined из B1 должен только добавить новый метод b1
вызывая реализацию A1::a1
в A1_Impl
,
Код, который вы разместили, компилируется нормально. Однако ошибка связывания, которую вы упомянули, возникнет в результате объявления
class B_Combined : virtual public A1_Impl, virtual public B1
{
};
потому что ты звонишь A1::a1();
в virtual void B1::b1
, но A1::a1
чисто абстрактный. Вы не должны звонить A1::a1
если вы не предоставите тело для этого.
Других решений пока нет …