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

用户名

假设我有以下情况:

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;这个想法是,在开发过程中,如果我添加了新属性,则不必总是记得要更改此构造函数。

请注意,我不能简单地更改名称,因为它是const

gflegar

您可以定义一个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所示)。对于非联合类类型(类和结构),运算符使用标量的内置赋值和类类型的复制赋值运算符,按照其初始化顺序,对对象的基础和非静态成员进行成员级拷贝复制赋值。

因此,对于您的示例,隐式定义的副本赋值运算符(当我们这样做时*this = other;调用的赋值运算符)的定义如下:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从Java中的派生类调用基类构造函数

在派生构造函数中的某些代码块之后,在派生类中调用基类构造函数

通过在基类中声明复制构造函数/操作符私有,可以使派生类不可复制吗?

C#-在派生类中调用基类和类构造函数

移动派生类的构造函数

是否可以从基类构造函数调用派生类构造函数?

向基类添加默认构造函数会更改sizeof()派生类型

从派生类访问模板基类的构造函数

派生类的构造函数可以比其基类的构造函数具有更多的参数吗?

复制派生类的构造方法

在基类构造函数中对派生类使用重写函数

为什么派生类可以调用基类构造函数两次?

让隐式派生类构造函数调用基类构造函数

C ++-派生类构造函数的行为

C ++派生类构造函数调用基类构造函数错误

从派生类调用构造函数

派生类中的重载构造函数

如何在Scala中从派生类辅助构造函数调用辅助基类构造函数?

从派生类构造函数调用基类构造函数

在声明派生类时调用基类的构造函数

从模板派生类调用模板基类的构造函数

派生类不能访问私有成员(尽管构造函数是在基类中定义的)

在基类构造函数中使用派生类属性

在派生类 C++ 的构造函数中调用基类的构造函数

从派生复制构造函数调用基类的移动构造函数

防止在无效的派生类初始值设定项上调用基类构造函数

在派生类和基类中使用静态构造函数的问题

如何使用指向函数的指针在基类构造函数中调用派生类的方法?

python派生类构造函数