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

如何在子类构造函数中正确重写父类成员变量?

如何在子类构造函数中正确修改父类的成员变量?

首先,你的代码出现问题的核心原因是命名冲突和错误的成员访问方式:你在wall构造函数里写的drawable::bounce = wall::bounce,编译器会把wall::bounce解析为wall类的静态成员,但你这里的bounce其实是构造函数的参数,并非静态成员,所以这条语句不仅无法正确赋值,还会引发编译错误。

下面给你两种正确的实现方式,优先推荐第一种:


方式一:通过父类构造函数初始化列表(推荐)

在C++中,初始化类成员的最佳实践是使用构造函数初始化列表,而不是在构造函数体内赋值——因为成员变量在进入构造函数体之前就已经完成初始化,体内赋值属于二次修改,效率更低,而且对于const或引用类型的成员必须用初始化列表处理。

步骤1:给父类drawable添加带bounce参数的构造函数

首先需要修改drawable类,添加一个可以初始化bounce的构造函数:

class drawable {
protected:
    window w;
    vector location;
    vector size;
    vector bounce;

    // 添加带bounce参数的构造函数
    drawable(window& w_ref, const vector& bounce_val) 
        : w(w_ref), bounce(bounce_val) {
        // 如果location、size需要默认值或其他初始化逻辑,也可以在这里补充
    }
};

步骤2:在子类wall的初始化列表中调用父类构造函数

修改wall的构造函数,通过初始化列表直接调用父类的构造函数来初始化bounce,不需要在构造函数体内再做赋值:

wall::wall(window & w, const vector & start, const vector & end, int update_interval, const vector& bounce)
    : rectangle(w, start, end),  // 调用rectangle的构造函数(假设rectangle继承自drawable)
      drawable(w, bounce),       // 调用drawable的构造函数,直接初始化bounce成员
      filled(false),
      update_interval(update_interval),
      update_count(0) {
    // 构造函数体内无需再处理bounce的赋值
}

方式二:在构造函数体内赋值(仅当无法修改父类时使用)

如果因为某些原因你不能修改drawable类的构造函数,那可以在wall的构造函数体内正确赋值,但要解决命名冲突问题:

修改构造函数参数名,避免和成员变量冲突

把构造函数的bounce参数重命名为bounce_val(或其他不冲突的名字),然后通过this->bounce或drawable::bounce来访问父类的成员变量:

wall::wall(window & w, const vector & start, const vector & end, int update_interval, const vector& bounce_val)
    : rectangle(w, start, end), filled(false), update_interval(update_interval), update_count(0) {
    // 两种写法都可以,任选其一
    this->bounce = bounce_val;
    // 或者 drawable::bounce = bounce_val;
}

这里的关键是:不要让参数名和父类成员变量名相同,否则编译器会优先解析参数,导致你无法正确访问父类的成员。如果一定要用相同的参数名,也可以用this->bounce明确指定要访问的是类的成员变量,而非构造函数参数。


内容的提问来源于stack exchange,提问作者Nico van Bentum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:48:13