C++ 参数太少继承c++;
我正在制作一个通用的C++ 参数太少继承c++;,c++,inheritance,C++,Inheritance,我正在制作一个通用的列表类来学习继承列表可以是无序列表、有序列表、堆栈或队列 我的列表类如下所示: class List { public: class Node { public: int data; Node * next; Node(int data); }; int sizeOfList = 0; Node * head = nullptr; List::List(); v
列表
类来学习继承<代码>列表可以是无序
列表、有序
列表、堆栈
或队列
我的列表
类如下所示:
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();
};
class UnOrderedList : public List
{
public:
UnOrderedList();
void get();
void insert(int data);
virtual void remove(); //takes no parameters because first item is always removed
};
lists[0] = new UnOrderedList();
我的Unordered
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();
};
class UnOrderedList : public List
{
public:
UnOrderedList();
void get();
void insert(int data);
virtual void remove(); //takes no parameters because first item is always removed
};
lists[0] = new UnOrderedList();
在main()
List * lists[8];
并制作一个无序列表,如下所示:
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();
};
class UnOrderedList : public List
{
public:
UnOrderedList();
void get();
void insert(int data);
virtual void remove(); //takes no parameters because first item is always removed
};
lists[0] = new UnOrderedList();
我的问题:
列出[listNum]->get()代码>给出错误
“函数调用中的参数太少”
因为它认为我试图在列表中调用get()
,但我希望它调用无序列表的函数get()
,您需要将get()
声明为列表中的虚拟方法。要么那样,要么dynamic\u cast
it
当您使用指向列表的指针调用get()
时,该特定指针可以指向列表的任何子类。仅仅因为List
的一个特定子类实现了一个特定的方法,并不意味着您可以使用指向基类的指针直接调用它
否则,就没有必要使用基类。这正是虚拟方法的用途:允许您使用指向基类的指针调用子类中的方法。您需要将get()
声明为列表中的虚拟方法。要么那样,要么dynamic\u cast
it
当您使用指向列表的指针调用get()
时,该特定指针可以指向列表的任何子类。仅仅因为List
的一个特定子类实现了一个特定的方法,并不意味着您可以使用指向基类的指针直接调用它
否则,就没有必要使用基类。这正是虚拟方法的用途:允许您调用子类中的方法,使用指向基类的指针。lists[0]
对于编译器来说是一个列表*
UnOrderedList::get()
不会覆盖List::get(int pos)
,因为签名不同。如果希望派生类重写基类中的函数,则函数签名必须相同
实际上,您需要将lists[listNum]
转换为UnOrderedList*
来调用UnOrderedList::get()
,例如static_cast(lists[listNum])->get()
lists[0]
就编译器而言是一个列表*
UnOrderedList::get()
不会覆盖List::get(int pos)
,因为签名不同。如果希望派生类重写基类中的函数,则函数签名必须相同
实际上,您需要将lists[listNum]
转换为UnOrderedList*
来调用UnOrderedList::get()
,例如static_cast(lists[listNum])->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
对象不知道它的子对象-因此List*
无法理解UnOrderedList
的详细信息
考虑这个例子:
class List
{
public:
virtual void get(int pos);
};
class UnOrderedList : public List
{
public:
virtual void get(); //STILL AN ERROR!
};
在本例中,我将UnOrderedList::get()
设置为虚拟-但是这没有帮助。由于列表仍然不了解此方法
正确的代码段如下所示:
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关键字。这确实会带来一些开销。我觉得我必须改进萨姆·瓦尔沙奇克的答案——尽管他完全正确
class List
{
public:
virtual void get(int pos);
};
class UnOrderedList : public List
{
public:
void get();
};
请注意,这里有两个问题,而不仅仅是一个
首先,get(int)
的签名不同于get()
此外,您还声明了方法List::get(int)
是虚拟的,但是您没有为UnOrderedList::get()
这样做-记住List
对象不知道它的子对象-因此List*
无法理解UnOrderedList
的详细信息
考虑这个例子:
class List
{
public:
virtual void get(int pos);
};
class UnOrderedList : public List
{
public:
virtual void get(); //STILL AN ERROR!
};
在本例中,我将UnOrderedList::get()
设置为虚拟-但是这没有帮助。由于列表仍然不了解此方法
正确的代码段如下所示:
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在评论中所说的,请注意这样一个事实:只有当您希望从父指针调用的方法是rou时,才需要virtual关键字