我有两个泛型类(Stack和Queue),并且由于Stack的大部分函数名称(Asssume是它的基类)都可以重复使用,而且我会在Stack And Queue中为这些函数分离逻辑
#ifndef STACK_H
#define STACK_H
template<class T>
class myStack{
private:
T *s;
int top,s_size;
public:
myStack(int k=40);
~myStack();
void push(T x);
T pop();
int isEmpty();
int isFull();
T peek();
void display();
};
#endif // STACK_H
以下是队列类头文件
#ifndef MYQUEUE_H
#define MYQUEUE_H
#include "stack.h"
template <class T>
class myQueue : public myStack<T>
{
private:
int f,r;
public:
void push(T x);
int isEmpty();
int isFull();
void display();
myQueue(int k=40);
T del();
T last();
T first();
virtual ~myQueue();
};
#endif // MYQUEUE_H
很明显我已经声明了下面的函数,没有它我的代码无法编译,是否真的需要在派生类中重新声明它们以具有单独的逻辑,或者我可以在派生类中使用这些函数而不用将它们放在标题中,因为函数已经被继承了
int isEmpty();
int isFull();
void display();
如果我没有在派生类
中重新声明它们,则遇到错误||=== Build: Debug in Data_Structures (compiler: GNU GCC Compiler) ===|
C:\Users\xprk569\Data_Structures\src\myQueue.cpp|13|error: no 'void myQueue<T>::display()' member function declared in class 'myQueue<T>'|
C:\Users\xprk569\Data_Structures\src\myQueue.cpp|34|error: no 'void myQueue<T>::push(T)' member function declared in class 'myQueue<T>'|
C:\Users\xprk569\Data_Structures\src\myQueue.cpp|41|error: no 'int myQueue<T>::isEmpty()' member function declared in class 'myQueue<T>'|
C:\Users\xprk569\Data_Structures\src\myQueue.cpp|46|error: no 'int myQueue<T>::isFull()' member function declared in class 'myQueue<T>'|
||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
答案 0 :(得分:1)
如果您想重新定义子类的方法,则需要重新声明它,以下内容不起作用:
struct A {
void foo () { }
};
struct B: public A { };
// error: no 'void B::foo()' member function declared in class 'B'
void B::foo () { }
另请注意,如果要使用多态(覆盖基本方法),则需要将方法设为虚拟:
struct A {
virtual void foo () { }
};
struct B: public A {
virtual void foo ();
};
void B::foo () { }
c ++ 11引入了一个新的override
关键字,您可以用它来检查您是否真的重写:
struct A {
void foo () { }
};
struct B: public A {
// error: 'void B::foo()' marked 'override', but does not override
void foo () override { }
};