无法使父类的虚拟函数正常工作
can't get virtual function of parent class to work
我有一个包含虚函数的父类,然后我创建一个子类并定义该函数。然后,我制作一个向量向量,并将其中一个子类插入其中。然后,我尝试调用虚拟函数,但没有输出到屏幕。我不知道为什么会这样,有人知道吗?
父类
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"输出到屏幕上,有什么想法为什么另一部分没有吗?
这是因为您存储的是实际的insect
s,而不是任何bee
s。 多态性(以其基本的C++方式(在做 3 件事时起作用:
- 具有正确定义和重写
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
的容器都不能包含任何其他内容;甚至不是派生自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
bee
s。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- C++程序已停止工作-求解常微分方程