如何在子类构造函数中正确重写父类成员变量?
如何在子类构造函数中正确修改父类的成员变量?
首先,你的代码出现问题的核心原因是命名冲突和错误的成员访问方式:你在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
相关产品推荐
相关产品推荐

