在泛型编程中,需要在派生类中重新声明基类成员函数
Need to re-declare the base class member functions in derived class in generic programming
我有两个通用类(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 { }
};
相关文章:
- 将子类方法声明为基类的友元
- 是否可以使用 using 将基类中的公共成员重新声明为派生类中的私有成员?
- 基类可以声明虚拟方法但不定义它吗?仍然在派生类中定义
- 从模板基类派生是否在派生类声明的点实例化模板
- 从基类的唯一指针中声明派生类的类型
- C++ 多态性:如果派生类中的虚函数在基类中声明了常量,是否需要将其声明为常量
- 通过派生类模板参数指定基类模板参数之一。如何使用基类的 using 声明
- 如何将指针存储在实例变量中,该指针被声明为指向基类的指针
- 声明基类类型的指针,但随后通过指向子类来实例化它.这是良好的编程实践吗?
- 无法使用在模板化基类 [C++] 中声明的枚举编译代码
- 是否可以在C++中声明基类,以便只能通过创建函数创建从它派生的类
- 使用基类指针 - cpp 的适当声明设计接口
- 在基类主体内声明但通过派生类召集的函数
- 通过"a pointer of the base class"访问未在基类中声明的子类的方法或属性(动态)
- 在派生的C 类中,访问基类受保护成员作为公共的访问声明
- 在基类中使用派生类,而在基类之后声明派生类
- 在派生类或基类中,我应该在哪里声明友元类
- 在调用基类构造函数时声明默认构造函数
- 如何使用派生类中的虚拟函数,该函数在另一个具有基类参数的类中声明
- 在泛型编程中,需要在派生类中重新声明基类成员函数