我可以直接继承实现以满足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
将从 MyStack
和 std::stack
继承 pop。你无法阻止它。
将
添加到JobStack
模板类定义的末尾以修复有关不完整类型的编译器错误。这不是你的问题的真正意义,这是一个红鲱鱼。您关心的实际编译器错误是cannot declare variable 'a' to be of abstract type 'JobStack<int>' ... because the following virtual functions are pure within 'JobStack<int>' ... void MyStack<T>::pop() [with T = int]
。附带说明一下,std::stack<T>::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以上是关于我可以直接继承实现以满足c ++中的接口吗的主要内容,如果未能解决你的问题,请参考以下文章