неразрешенный внешний символ с алмазной структурой

Следующий код работает отлично:

#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,

0

Решение

Код, который вы разместили, компилируется нормально. Однако ошибка связывания, которую вы упомянули, возникнет в результате объявления

class B_Combined : virtual public A1_Impl, virtual public B1
{
};

потому что ты звонишь A1::a1(); в virtual void B1::b1, но A1::a1 чисто абстрактный. Вы не должны звонить A1::a1 если вы не предоставите тело для этого.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector