如何实现可修改基类成员的派生类拷贝构造函数
如何实现Person类的拷贝构造函数并修改name属性?
首先得明确一个关键限制:你的基类NamedObject里的name_是const std::string类型,这意味着一旦对象构造完成,这个成员就无法被修改了。所以常规“先拷贝整个对象,再修改name”的思路走不通,必须换个方式。
解决方案:自定义带参数的拷贝构造逻辑
我们可以写一个接受原Person对象和新name的构造函数,在初始化列表里直接用新name构造基类部分,同时复制派生类的age_成员:
class Person: public NamedObject{ public: Person(const std::string &name, int age): NamedObject(name), age_{age}{} // 自定义拷贝构造逻辑:复制原对象的age,同时使用新name构造基类 Person(const Person& original, const std::string& new_name) : NamedObject(new_name), age_(original.age_) {} private: int age_; };
为什么这样可行?
- 基类
NamedObject的构造函数需要一个std::string参数,我们在初始化列表里直接传入新的name,跳过了拷贝基类原对象的步骤(因为原对象的name是const的,我们没法复用它之后再修改)。 - 派生类的
age_是普通int成员,直接从原对象复制即可,完美保留原对象的这部分状态。
更直观的替代方案:工厂成员函数
如果你觉得带两个参数的构造函数语义不够清晰,也可以写一个普通成员函数来生成修改name后的新对象:
class Person: public NamedObject{ public: Person(const std::string &name, int age): NamedObject(name), age_{age}{} // 返回一个新的Person对象,保留当前age,替换为新name Person with_new_name(const std::string& new_name) const { return Person(new_name, age_); } private: int age_; };
调用的时候就像这样:
Person alice("Alice", 30); Person bob = alice.with_new_name("Bob");
这种方式可读性更强,也更符合日常的代码习惯。
内容的提问来源于stack exchange,提问作者user7431005
相关产品推荐
相关产品推荐

