gpt4 book ai didi

c++ - 参数继承 C++ 太少

转载 作者:太空宇宙 更新时间:2023-11-04 16:05:51 25 4
gpt4 key购买 nike

我正在通过制作一个通用的 List 来学习继承类(class)。 List可以是 Unordered列表,Ordered列表,一个 Stack , 或 Queue .

我的 List类看起来像这样:

class List
{
public:

class Node
{
public:
int data;
Node * next;
Node(int data);
};

int sizeOfList = 0;
Node * head = nullptr;
List::List();
virtual void get(int pos);
virtual void insert(int data);
virtual void remove(int pos);
virtual void list();
virtual int size();
};

我的 Unordered列表类如下所示:

class UnOrderedList : public List
{
public:
UnOrderedList();

void get();
void insert(int data);
virtual void remove(); //takes no parameters because first item is always removed
};

main() ,我创建了一个这样的列表数组;

List * lists[8];

然后像这样创建一个无序列表:

lists[0] = new UnOrderedList();

我的问题: lists[listNum]->get();给出错误

"too few arguments in function call"

因为它认为我正在尝试调用 get()List类,但我希望它调用无序列表的函数 get() .

最佳答案

我觉得我必须改进 Sam Varshachik 的回答 - 尽管他是完全正确的。

class List
{
public:
virtual void get(int pos);
};
class UnOrderedList : public List
{
public:
void get();
};

请注意,这里有两个问题 - 而不仅仅是一个。

首先 get(int) 的签名不同于 get() - 这是两种不同的方法,编译器会处理他们就是这样。
此外,您已经声明方法 List::get(int) 是虚拟的,但您还没有为 UnOrderedList::get() 这样做 - 请记住 list 对象不知道它的 child - 因此 list * 无法理解 UnOrderedList 的细节。

考虑这个例子:

class List
{
public:
virtual void get(int pos);
};
class UnOrderedList : public List
{
public:
virtual void get(); //STILL AN ERROR!
};

在这种情况下,我已将 UnOrderedList::get() 设为虚拟 - 但这无济于事。因为 list 仍然不知道这个方法

正确的片段如下:

class List
{
public:
virtual void get(int pos);
virtual void get();
};
class UnOrderedList : public List
{
public:
virtual void get(); //We can use this now!
virtual void get(int pos); //This is only needed if we intend to override this method
};

在此示例中,list::get() 现在是一个虚方法 - 因此,对它的任何调用都将按照您的预期传递给正确的子对象。
然而,这是唯一可能的,因为父类已被告知存在这样的方法,并且可以被子类覆盖

[编辑/]

正如 JonathanPotter 在评论中所述,请注意只有当您希望从父指针调用的方法被路由到实际的子对象时,才需要 virtual 关键字。这确实会产生一些开销。

关于c++ - 参数继承 C++ 太少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35691451/

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