父类虚函数调用失效求助:子类Bee的attack函数无输出
问题根源:对象切片(Object Slicing)
你遇到的是C++里非常经典的对象切片问题,这就是为什么你的虚函数调用没有触发子类bee的实现。
为什么会发生切片?
你的二维容器定义是:
vector< vector<insect> > insects_on_board(10);
这里存储的是insect类型的实体对象,而非指针或引用。当你执行push_back(bee())时,C++会把bee对象隐式转换为insect对象——这个过程中,bee子类特有的所有成员(包括你重写的attack()函数的虚表信息)都会被“切掉”,只保留父类insect的部分。所以最后你调用的attack()其实是父类的空实现,自然没有输出。
另外还要提一句:你在bee子类里重复定义了armor和damage,这会隐藏父类的同名成员,属于不良实践,建议直接复用父类的成员变量,避免不必要的混乱。
解决方案:使用指针(推荐智能指针)
要保留多态特性,容器里需要存储指向父类的指针(最好是智能指针,避免手动管理内存的麻烦)。修改步骤如下:
给父类添加虚析构函数:
这是使用多态指针的必要操作,否则删除子类指针时会导致内存泄漏: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(){} // 添加虚析构 virtual ~insect() = default; };修改容器类型为智能指针容器:
vector< vector<unique_ptr<insect>> > insects_on_board(10);这里用
unique_ptr是因为它是独占式智能指针,适合这种场景;如果需要共享所有权,可以用shared_ptr。修改添加bee的代码:
使用make_unique创建bee对象的智能指针:void add_bee(vector< vector<unique_ptr<insect>> > &insects_on_board, int &bees){ bees++; insects_on_board[9].push_back(make_unique<bee>()); }修改函数调用代码:
因为存储的是指针,所以要用->调用成员函数:cout << "testing " << insects_on_board.at(9).at(0)->type << endl; insects_on_board.at(9).at(0)->attack();
这样修改后,调用attack()时就会正确触发bee子类的重写版本,输出你预期的im a bee, stab stab!了。
内容的提问来源于stack exchange,提问作者billy
相关产品推荐
相关产品推荐

