未解决的外部符号与钻石结构

时间:2014-03-01 23:55:04

标签: c++ inheritance linker pure-virtual diamond-problem

以下代码完美无缺:

#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::a1A1_Impl的实现(它是唯一的实现)。

但我也收到一条错误消息:

error LNK2001: unresolved external symbol ""public: virtual void __thiscall A1::a1(void)" (?a1@A1@@UAEXXZ)".

我对此感到有点困惑。为什么A1_Impl中的实现不起作用?从B1派生B_Combined只应添加一个新方法b1,在A1::a1中调用A1_Impl的实现。

1 个答案:

答案 0 :(得分:0)

您发布的代码编译得很好。但是,您提到的链接错误将来自声明

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

您可以在A1::a1();中致电virtual void B1::b1,但A1::a1是纯抽象的。除非您为其提供正文,否则不得致电A1::a1

相关问题