C++ 一个基类中的MI函数定义不足以满足另一个基类的虚函数

C++ 一个基类中的MI函数定义不足以满足另一个基类的虚函数,c++,c++11,multiple-inheritance,virtual-functions,vtable,C++,C++11,Multiple Inheritance,Virtual Functions,Vtable,我有一个从接口和基类继承的派生类。该接口定义了一个虚拟函数GetId,该函数在另一个基类中实现 class ITestClient { public: virtual int GetId() = 0; }; class BaseClient { public: int GetId(); } int BaseClient::GetId() { return 10; } class TestClient : public ITestClient, public Ba

我有一个从接口和基类继承的派生类。该接口定义了一个虚拟函数
GetId
,该函数在另一个基类中实现

class ITestClient
{
  public:
    virtual int GetId() = 0;
};

class BaseClient
{
  public:
    int GetId();
}

int BaseClient::GetId()
{
  return 10;
}

class TestClient : public ITestClient, public BaseClient {
};
我得到了
未实现的纯虚拟方法“GetId”
。所以我可以这样做来修复编译错误

class TestClient : public ITestClient, public BaseClient {
  int GetId()
  {
    return BaseClient::GetId();
  }
};

为什么基类
BaseClient
GetId
的具体函数定义不足以实现接口的虚拟函数?

我不确定是否理解这个问题。
BaseClient
is-not-A
ITestClient
(is-A关系是所需的继承属性)。因此,
BaseClient
中的定义不能是该接口函数的实现


你朋友的儿子不会因为你开车带着他就开始长得像你,但是你自己的儿子会。这就是等价关系。

为什么不让
BaseClient
ITestClient
派生出来?你是在问为什么语言是这样定义的吗?或者你认为编译器中有bug吗?想象一下编译器按照你期望的方式工作。如果您从另一个类派生,
Unrelated
,该类也恰好有一个名为
GetId()
(该方法与
ITestClient
无关;假设它来自第三方库)的方法,该怎么办?更糟糕的是,假设
Unrelated
最初没有
GetId()
方法,并且您的程序运行良好;但是后来第三方作者出于自己的原因添加了一个私有的
GetId()
。C++有足够的问题,或者考虑如下:<代码>类基数{虚拟int GeTyd(){{返回};};类无关{};派生类:公共基,公共无关{}到目前为止还不错:
d;d、 GetId()将返回42。现在,有人将
private:int-GetId(){return-1;}
添加到
无关的
。在你的理想世界里会发生什么?这应该是一个错误吗?是否应该忽略
Unrelated::GetId()
?或者应该
d.GetId()
悄悄地改变意思并开始返回-1,在它返回42之前的哪个位置?@IgorTandetnik这是有道理的,谢谢。我对继承权的看法是错误的。我认为,由于BaseClient和ITestClient都“在同一辆车上”,编译器可以让它们彼此相处。在Java中,等价的代码正是询问者所认为的那样工作。所以答案需要对C++是特定的。当然,因为代码是C++,而他的标签是C++ +C++ 11,所以我没有理由认为这个问题与C++无关。