无法使父类的虚拟函数正常工作

can't get virtual function of parent class to work

本文关键字:常工作 工作 函数 父类 虚拟      更新时间:2023-10-16

我有一个包含虚函数的父类,然后我创建一个子类并定义该函数。然后,我制作一个向量向量,并将其中一个子类插入其中。然后,我尝试调用虚拟函数,但没有输出到屏幕。我不知道为什么会这样,有人知道吗?

父类

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

};

儿童班

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

我的问题

所以在输出中,我期望看到"测试 B",然后"我是一只蜜蜂,刺伤!

但只有"测试B"输出到屏幕上,有什么想法为什么另一部分没有吗?

这是因为您存储的是实际的insects,而不是任何bees。 多态性(以其基本的C++方式(在做 3 件事时起作用:

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

您错过了第 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();

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

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

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

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