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你还有其他问题吗?