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

C++如何在子类中实现父类成员对象的方法重写

可行解决方案

下面给出两种工业界常用的实现方案:

方案1:抽象基类+多态(经典面向对象实现)

核心思路是将Brain定义为抽象基类,把需要自定义的changeSpeed声明为纯虚函数,在Car类内部定义Brain的派生类,各自实现对应的调速逻辑。需要注意原代码中User存储Brain值会导致对象切片,需改为存储智能指针保证多态生效。
修改后核心代码示例:

#include <memory>
// 前置声明Car类
class Car;
// 抽象Brain基类
class Brain{
public:
    Brain(std::string name):name(name){}
    virtual ~Brain() = default; // 多态基类必须有虚析构函数
    std::string getName(){
        return this->name;
    }
    virtual void changeSpeed(Car* car) = 0; // 传入Car指针操作speed成员
private:
    std::string name;
};

class User{
public:
    void addBrain(std::unique_ptr<Brain> b){
        brains_.push_back(std::move(b));
    }
    void showBrains(){
        for(auto &b:brains_){
            std::cout << b->getName() << std::endl;
        }
    }
    void apply(int index, Car* car){
        brains_[index]->changeSpeed(car);
    }
private:
    std::vector<std::unique_ptr<Brain>> brains_;
};

class Car: public User{
    // 内部定义两种Brain实现
    class AddSpeedBrain : public Brain {
    public:
        AddSpeedBrain(std::string name) : Brain(name) {}
        void changeSpeed(Car* car) override {
            car->speed += 1;
        }
    };
    class SubSpeedBrain : public Brain {
    public:
        SubSpeedBrain(std::string name) : Brain(name) {}
        void changeSpeed(Car* car) override {
            car->speed -= 1;
        }
    };
public:
    Car(){
        // 实例化派生类Brain加入列表
        addBrain(std::make_unique<AddSpeedBrain>("one"));
        addBrain(std::make_unique<SubSpeedBrain>("two"));
    }

    void change(int index){
        this->apply(index, this);
        std::cout << "car speed " << getSpeed() << std::endl;
    }

    int getSpeed(){
        return this->speed;
    }

private:
    int speed=0;
};

该方案适合Brain还有其他自定义接口、逻辑复杂度较高的场景,扩展性强,符合面向对象设计规范。

方案2:std::function回调绑定(轻量灵活实现)

如果只需要自定义changeSpeed单个方法,不需要多套扩展接口,可以用回调的方式实现,不需要继承层级,代码更简洁。
核心思路是在Brain内部存储一个可调用对象,创建Brain实例时直接传入Car中定义的lambda表达式作为changeSpeed的实现,lambda可以直接捕获Car的this指针操作成员变量。
修改后核心代码示例:

#include <functional>
class Brain{
public:
    Brain(std::string name, std::function<void()> func):name(name), change_func(std::move(func)){}
    std::string getName(){
        return this->name;
    }
    void changeSpeed(){
        if (change_func) change_func();
    }
private:
    std::string name;
    std::function<void()> change_func; // 存储自定义逻辑
};

class User{
public:
    void addBrain(Brain b){
        brains_.push_back(std::move(b));
    }
    void showBrains(){
        for(auto &b:brains_){
            std::cout << b.getName() << std::endl;
        }
    }
    void apply(int index){
        brains_[index].changeSpeed();
    }
private:
    std::vector<Brain> brains_;
};

class Car: public User{
public:
    Car(){
        // 创建Brain时直接传入对应逻辑的lambda
        Brain one("one", [this](){
            this->speed +=1;
        });
        Brain two("two", [this](){
            this->speed -=1;
        });
        addBrain(std::move(one));
        addBrain(std::move(two));
    }

    void change(int index){
        this->apply(index);
        std::cout << "car speed " << getSpeed() << std::endl;
    }

    int getSpeed(){
        return this->speed;
    }

private:
    int speed=0;
};

该方案代码量更少,灵活性更高,适合单方法自定义的轻量场景,不需要维护复杂的继承关系。

内容的提问来源于stack exchange,提问作者Xgo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:57:04