C++ 具有菱形结构的未解析外部符号

C++ 具有菱形结构的未解析外部符号,c++,inheritance,linker,pure-virtual,diamond-problem,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() {} };

下面的代码工作得非常好:

#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':通过支配继承'A1_Impl::A1_Impl::A1'”
警告。我想这没关系,因为我希望B_合并来继承
A1::A1
A1_Impl
的实现(这是唯一的实现)

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

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

我对此有点困惑。为什么A1_Impl中的实现不起作用?从B1派生B_组合只应添加一个新方法
B1
,在
A1 Impl

中调用
A1::A1
的实现。但是,您提到的链接错误将由声明

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

因为您确实调用了
A1::A1()virtualvoid B1::B1
中的code>是纯抽象的。除非提供正文,否则不能调用
A1::A1

它对我很好:@user3369521请显示您的真实代码,这很好编译是的,您是对的,必须删除注释才能看到问题。但我仍然不明白为什么会有未解析的符号。正如您所说,我调用A1::A1(),它不是在B1中实现的,而是在A1_Impl中实现的,这不算吗?不,类B1 abd A1_Impl不共享实现。它们都派生自A1,如果要使用虚拟A1,它们都必须实现虚拟A1。此外,您永远不能直接调用A1::A1(),因为这是静态调用,并且函数没有body@user3369521你还有其他问题吗?