我可以直接继承实现以满足c ++中的接口吗

Posted

技术标签:

【中文标题】我可以直接继承实现以满足c ++中的接口吗【英文标题】:Can I directly inherit implementations to satisfy interfaces in c++ 【发布时间】:2017-04-25 18:42:49 【问题描述】:

在C++中,如果我知道一个类会满足虚方法,是否可以修改下面的内容直接继承它?现在编译器说不完整的类型是不允许的。我可以写一个包装器,但是有直接的方法吗?

#include <stack>

template<class T> class MyStack
public:
    virtual T pop()=0;
;

template<class T> class JobStack : public MyStack<T>, public std::stack<T>;

int main()

    JobStack<int> a;
    a.push(1);
    a.pop(a);

【问题讨论】:

你说的直接继承是什么意思?您从未实现过JobStack,因此您只能以某些方式使用它。 我的意思是没有将 pop 指向堆栈的 pop - 继承会自动完成 没有。 JobStack 将从 MyStackstd::stack 继承 pop。你无法阻止它。 添加到JobStack 模板类定义的末尾以修复有关不完整类型的编译器错误。这不是你的问题的真正意义,这是一个红鲱鱼。您关心的实际编译器错误是cannot declare variable 'a' to be of abstract type 'JobStack&lt;int&gt;' ... because the following virtual functions are pure within 'JobStack&lt;int&gt;' ... void MyStack&lt;T&gt;::pop() [with T = int]。附带说明一下,std::stack&lt;T&gt;::pop() 的返回类型实际上是void,而不是T——所以这无论如何都不是一个合适的实现。也解决这个问题。 MyStack 中有一个纯虚方法pop()。你期望这个方法做什么?如果不提供实现,编译器怎么知道如何生成呢? 【参考方案1】:

第一:

template<class T> class JobStack : public MyStack<T>, public std::stack<T>;

其次,回答你的问题:不。你不能。 因为,正如其中一个 cmets 所指出的,您继承了两个不同的类,这意味着您将拥有两个继承的 pop() 函数。您将不得不在派生类中实现 pop()。 如果您仍然想在 std::stack 中使用实现,那么只需在实现中调用它即可。

第三,当您尝试从 main 调用 pop() 时,您可能仍然会遇到错误,因为现在,您的类对于两个不同的函数存在名称冲突。如果出现这个问题,建议将MyStack中的函数重命名为myPop()之类的。

【讨论】:

它会编译,但你不能实例化它 IE int main() JobStack a; 失败 @ProbablyAStupidQuestion 让我检查一下。 @ProbablyAStupidQuestion 在这里您可以找到有关第三期的更多信息:***.com/questions/2004820/… 如果它仍然不起作用,请告诉我。

以上是关于我可以直接继承实现以满足c ++中的接口吗的主要内容,如果未能解决你的问题,请参考以下文章

接口能被继承吗?

java中的接口,实现类之间的关系

当一个类实现一个接口时,它必须实现该接口中的所有方法。(判断题)

Java的多接口实现到底有啥好处?

java中的多重继承是啥意思?

谁可以用c帮我写出一个继承关系的实例