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-AITestClient
(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++无关。