【问题标题】:Can I directly inherit implementations to satisfy interfaces in c++我可以直接继承实现以满足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()。你期望这个方法做什么?如果不提供实现,编译器怎么知道如何生成呢?

标签: c++


【解决方案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 在这里您可以找到有关第三期的更多信息:stackoverflow.com/questions/2004820/… 如果它仍然不起作用,请告诉我。
猜你喜欢
  • 2014-10-06
  • 2015-12-23
  • 1970-01-01
  • 2015-11-24
  • 2011-04-29
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 2019-10-05
相关资源
最近更新 更多