gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:43:12 25 4
gpt4 key购买 nike

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

最佳答案

如果你想为子类重新定义一个方法,你需要重新声明它,下面是行不通的:

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

关于c++ - 泛型编程需要在派生类中重新声明基类成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36716817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com