Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 参数太少继承c++;_C++_Inheritance - Fatal编程技术网

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关键字