需要在泛型编程

时间:2016-04-19 11:17:53

标签: c++ templates c++11 inheritance c++14

我有两个泛型类(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)) ===|

1 个答案:

答案 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 { }
};