0

以下代码可以正常工作:

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

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

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

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

4

1 回答 1

0

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

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

因为你确实打电话A1::a1();virtual void B1::b1A1::a1纯粹是抽象的。A1::a1除非您为它提供身体,否则您不得打电话。

于 2014-03-02T00:09:40.307 回答