复制构造函数,用于派生类更改基类

时间:2018-04-14 16:07:21

标签: c++ inheritance copy-constructor derived-class

我们假设我有以下情况:

ora-12504:tns:listener was not given the SERVICE_NAME in CONNECT_DATA

我想创建一个"复制构造函数"我从class NamedObject{ public: NamedObject(const std::string &name):name_{std::move(name)}{} private: const std::string name_; } class Person: public NamedObject{ public: Person(const std::string &name, int age): NamedObject(name), age_{age}{} private: int age_; } 复制所有成员但更改名称(无论出于何种原因)。

Person

现在假设我不仅有一个属性,如class Person: public NamedObject{ public: Person(const std::string &name, int age): NamedObject(name), age_{age}{} Person(const std::string &newName, const Person &other): NamedObject(name){ age_ = other.age; } private: int age_; } ,还有很多属性,在开发过程中它们会发生很大的变化。是否可以轻松地创建像age这样的函数而无需手动复制Person(const std::string &newName, const Person &other)等所有属性。我的想法是,在开发过程中,如果我添加一个新属性,我不必总是记得改变这个构造函数。

请注意,我不能简单地更改名称,因为它是age_ = other.age;

1 个答案:

答案 0 :(得分:0)

您可以在NamedObject上定义一个什么都不做的赋值运算符。然后,您就可以在“复制构造函数”中使用*this = other

class NamedObject{
public:
    NamedObject(const std::string &name):name_{name}{}
    NamedObject &operator= (const NamedObject &) {
        return *this;
    }
    const std::string name_;
};


class Person: public NamedObject{
public:
    Person(const std::string &name, int age): NamedObject(name), age_{age}{}
    Person(const std::string &newName, const Person &other): NamedObject(newName){
        *this = other;
    }
    int age_;
};

实例:https://onlinegdb.com/rJ4J5oy3M

为什么会这样:

C ++将自动为符合条件的类定义复制赋值运算符(有关符合条件的含义的详细信息,请查看以下链接)。来自cppreference

  

如果既未删除隐式声明的复制赋值运算符   它也是定义的(也就是说,生成一个函数体并且   编译)编译器如果使用odr。对于工会类型,   隐式定义的复制分配复制对象表示   (如std :: memmove)。对于非联合类类型(类和结构),   运算符执行对象的成员方式复制分配   base和非静态成员,按其初始化顺序,使用   标量和副本赋值运算符的内置赋值   班级类型。

因此,对于您的示例,隐式定义的复制赋值运算符(当我们执行*this = other;时调用的运算符)将定义如下:

  • 它将使用NamedObject的复制赋值运算符来复制基类(我们定义为什么都不做,因此它不会复制name_),
  • 它将使用age_的复制赋值运算符以及您添加到该类的任何其他成员。