无法使用 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++ 方式)起作用:
- 具有正确定义和覆盖
virtual
方法的类型层次结构(就像您在这里做的那样)
- 创建子实例(或各种父子实例)
- 通过指针(或引用)访问它们。
您缺少第 2 点和第 3 点。
因此,修复它的一种方法是存储指向 insect
的指针,并将它们初始化为 bee
s 或普通 insect
s,如下所示:
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
s 的容器都不能包含任何其他内容;甚至 类 都不是从 insect
派生的。您阅读和听到的所有多态性和内容仅适用于 指向父子类型(或对它们的引用)的指针。
因此,您的 add_bee
函数应如下所示:
void add_bee (vector<vector<insect *>> & insects_on_board, int & bees) {
bees++;
insects_on_board[9].push_back(new bee());
}
我只做了两处更改:向量现在包含指向 insect
的指针,我正在 new
ing bee
s。
我有一个 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++ 方式)起作用:
- 具有正确定义和覆盖
virtual
方法的类型层次结构(就像您在这里做的那样) - 创建子实例(或各种父子实例)
- 通过指针(或引用)访问它们。
您缺少第 2 点和第 3 点。
因此,修复它的一种方法是存储指向 insect
的指针,并将它们初始化为 bee
s 或普通 insect
s,如下所示:
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
s 的容器都不能包含任何其他内容;甚至 类 都不是从 insect
派生的。您阅读和听到的所有多态性和内容仅适用于 指向父子类型(或对它们的引用)的指针。
因此,您的 add_bee
函数应如下所示:
void add_bee (vector<vector<insect *>> & insects_on_board, int & bees) {
bees++;
insects_on_board[9].push_back(new bee());
}
我只做了两处更改:向量现在包含指向 insect
的指针,我正在 new
ing bee
s。