You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

父类虚函数调用失效求助:子类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,这会隐藏父类的同名成员,属于不良实践,建议直接复用父类的成员变量,避免不必要的混乱。

解决方案:使用指针(推荐智能指针)

要保留多态特性,容器里需要存储指向父类的指针(最好是智能指针,避免手动管理内存的麻烦)。修改步骤如下:

  1. 给父类添加虚析构函数:
    这是使用多态指针的必要操作,否则删除子类指针时会导致内存泄漏:

    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;
    };
    
  2. 修改容器类型为智能指针容器:

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

    这里用unique_ptr是因为它是独占式智能指针,适合这种场景;如果需要共享所有权,可以用shared_ptr。

  3. 修改添加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>());
    }
    
  4. 修改函数调用代码:
    因为存储的是指针,所以要用->调用成员函数:

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:55:18