【发布时间】: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()。你期望这个方法做什么?如果不提供实现,编译器怎么知道如何生成呢?
标签: c++