在泛型编程中,需要在派生类中重新声明基类成员函数

Need to re-declare the base class member functions in derived class in generic programming

本文关键字:声明 基类 函数 成员 泛型编程 派生 新声明      更新时间:2023-10-16

我有两个通用类(Stack和Queue),由于Stack的大多数函数名(假设它是基类)都可以重复使用,我在Stack和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:Usersxprk569Data_StructuressrcmyQueue.cpp|13|error: no 'void myQueue<T>::display()' member function declared in class 'myQueue<T>'|
C:Usersxprk569Data_StructuressrcmyQueue.cpp|34|error: no 'void myQueue<T>::push(T)' member function declared in class 'myQueue<T>'|
C:Usersxprk569Data_StructuressrcmyQueue.cpp|41|error: no 'int myQueue<T>::isEmpty()' member function declared in class 'myQueue<T>'|
C:Usersxprk569Data_StructuressrcmyQueue.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)) ===|

如果您想为子类重新定义方法,您需要重新声明它,以下操作不起作用:

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 { }
};
相关文章: