子类的拷贝、赋值构造函数切记不忘父类成员

#include<iostream>
using namespace std;
class Base
{
    public:
        Base(char *_name){int len=strlen(_name);if(len==0){name=new char[1];name[0]='/0';}
            else{name=new char[len+1];strcpy(name,_name);}cout<<"creat "<<name<<endl;} 
        Base(const Base &b){name=new char[strlen(b.name)+1];strcpy(name,b.name);cout<<"copy "<<name<<endl;}
        Base &operator=(const Base &b){if(this==&b)return *this;delete []name;;name=new char[strlen(b.name)+1];strcpy(name,b.name);cout<<"assign "<<name<<endl;return *this;}
            virtual ~Base(){cout<<"del "<<name<<endl;delete []name;}
    private:
        char *name;
};

class Derived:virtual public Base//effective in multiple inherit
{
    public:
        Derived(char *_name,char *_descrip):Base(_name)
            {
            int len=strlen(_descrip);
            if(len==0)
            {
                descrip=new char[1];
                descrip[0]='/0';
            }
            else
            {
                descrip=new char[len+1];
                strcpy(descrip,_descrip);
            }
            cout<<"creat "<<descrip<<endl;
        }
        Derived(const Derived &d):Base(d){descrip=new char[strlen(d.descrip)+1];strcpy(descrip,d.descrip);cout<<"copy "<<descrip<<endl;}//do remember to intitialize parent's data members in this way
        Derived &operator=(const Derived &d)
        {
            if(this==&d)
                return *this;
            Base::operator=(d);//call this if = is overlapped in the base class
            //static_cast<&Base>(*this)=d;call this if = not overlapped,and reference a must!
            delete []descrip;
            descrip=new char[strlen(d.descrip)+1];
            strcpy(descrip,d.descrip);
            cout<<"assign "<<descrip<<endl;
            return *this;
        }
        ~Derived(){cout<<"del "<<descrip<<endl;delete []descrip;}
    private:
        char *descrip;
};
int main()
{
    Derived d1("a","best");
    Derived d2(d1);
    cout<<endl<<endl;
    Derived d3("b","great");
    d2=d3;
    cout<<endl<<endl;
}


prayaya@prayaya:~/Desktop/lab$ ./a.out
creat a
creat best
copy a
copy best


creat b
creat great
assign b
assign great


del great
del b
del great
del b
del best
del a

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,子类拷贝构造函数默认不会自动调用父类拷贝构造函数拷贝父类特有成员。这种认为是错误的。子类拷贝构造函数只会负责拷贝子类特有的成员,而不会主动调用父类拷贝构造函数拷贝父类特有成员。 如果想要在子类拷贝构造函数拷贝父类特有成员,需要手动调用父类拷贝构造函数,并将父类对象作为参数传递给它。这样才能确保父类特有成员也被正确地拷贝子类对象中。 例如,假设有一个派生类Derived,它继承自基类Base,并且Derived类拥有一些父类没有的特有成员。那么,在Derived类的拷贝构造函数中,应该在成员初始化列表中调用Base类的拷贝构造函数拷贝父类特有成员。这样才能保证Derived对象的父类特有成员得到正确的拷贝。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [子类拷贝构造是否会调用父类拷贝构造?](https://blog.csdn.net/Think88666/article/details/91639448)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++ 子类拷贝构造函数调用其父类拷贝构造函数](https://blog.csdn.net/weixin_34392906/article/details/92771176)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值