【问题标题】:unresolved external symbol with diamond structure具有菱形结构的未解析外部符号
【发布时间】:2014-03-01 23:55:03
【问题描述】:

以下代码运行良好:

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

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

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

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

【问题讨论】:

  • 对我来说很好用:ideone.com/817Pli
  • @user3369521 请出示你的真实代码,这样编译正常

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


【解决方案1】:

您发布的代码编译良好。但是,您提到的链接错误将由声明引起

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

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

【讨论】:

  • 是的,你是对的,你必须删除评论才能看到问题。但我仍然不明白为什么存在未解析的符号。正如你所说,我调用 A1::a1(),它没有在 B1 中实现,但在 A1_Impl 中实现,这不算吗?
  • 不,B1 abd A1_impl 类不共享实现。它们都是从 A1 派生的,如果要使用它,它们都必须实现虚拟 a1。此外,您永远不能直接调用 A1::a1(),因为这是静态调用,函数没有主体
  • @user3369521 您还有其他问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 2016-01-29
  • 2014-06-13
  • 2011-02-09
相关资源
最近更新 更多