无法使用 parent class 的虚函数

can't get virtual function of parent class to work

我有一个 parent class 里面有一个虚函数,然后我创建一个 child class 并定义这个函数。然后,我制作了一个向量向量,并将 child class 中的一个插入其中。然后我尝试调用虚函数,但没有任何输出到屏幕。我不知道为什么会这样,有人知道吗?

Parent Class

class insect{
        public:
           string type;
           int food_cost;
           int armor;
           int damage;
           insect();
           void set_food_cost(int x);
           void set_armor(int x);
           void set_damage(int x);
           virtual void attack(){} // this is the problematic function


};

Child Class

class bee: public insect{
        public:
           bee();
           int armor;
           int damage;
           void set_armor(int x);
           void attack();


};

void bee::attack(){
        cout << "im a bee, stab stab!\n";
}

创建向量的向量

vector< vector<insect> > insects_on_board(10);

将一只蜜蜂添加到向量的向量中

void add_bee(vector< vector<insect> > &insects_on_board, int &bees){
        bees++;
insects_on_board[9].push_back(bee());
}

函数调用

cout << "testing " << insects_on_board.at(9).at(0).type << endl;
        insects_on_board.at(9).at(0).attack();

输出

testing B

又是我的问题

所以我希望在输出中看到 "testing B" 然后 "im a bee, stab stab!"

但只有 "testing B" 输出到屏幕,知道为什么其他部分没有吗?

那是因为您存储的是实际的 insect 而不是任何 bee。当你做 3 件事时,多态性(以其基本的 C++ 方式)起作用:

  1. 具有正确定义和覆盖 virtual 方法的类型层次结构(就像您在这里做的那样)
  2. 创建子实例(或各种父子实例)
  3. 通过指针(或引用)访问它们。

您缺少第 2 点和第 3 点。

因此,修复它的一种方法是存储指向 insect 的指针,并将它们初始化为 bees 或普通 insects,如下所示:

vector<vector<insect *>> insects_on_board (10, vector<insect *>(2)); // note the type
insects_on_board[9][0] = new bee;
insects_on_board[9][1] = new insect;

// Note the use of "->" instead of "."
cout << "testing " << insects_on_board[9][0]->type << endl;
insects_on_board[9][0]->attack();

// Contrast the output with the above's
cout << "testing " << insects_on_board[9][1]->type << endl;
insects_on_board[9][1]->attack();

更新: 请注意(在基本级别)任何按值存储 insects 的容器都不能包含任何其他内容;甚至 类 都不是从 insect 派生的。您阅读和听到的所有多态性和内容仅适用于 指向父子类型(或对它们的引用)的指针

因此,您的 add_bee 函数应如下所示:

void add_bee (vector<vector<insect *>> & insects_on_board, int & bees) {
    bees++;
    insects_on_board[9].push_back(new bee());
}

我只做了两处更改:向量现在包含指向 insect 的指针,我正在 newing bees。