首页 > 编程语言 > 详细

C++复制对象时勿忘每一部分

时间:2014-03-20 05:20:58      阅读:419      评论:0      收藏:0      [点我收藏+]

现看这样一个程序:

bubuko.com,布布扣
void logCall(const string&  funcname) //标记记录
{
    cout <<funcname <<endl;
}

class Custom
{
    public:
    Custom(const Custom& p):name(p.name)
    {
        logCall("Custom copy constructor!")
    }
    Custom& operator=(const Custom& p)
    {
        logCall("Custom copy assignment operator!")
        name=p.name;
        return *this;
    }
    private :
        string  name;
};

class PriorityCustom:public Custom   //派生类
{
    public:
    PriorityCustom(const PriorityCustom& p):priority(p.priority)
    {
        logCall("PriorityCustom copy constructor!")
    }
    PriorityCustom& operator=(const PriorityCustom& p)
    {
        logCall("PriorityCustom copy assignment operator!")
        priority=p.priority;
        return *this;
    }
    private :
        string  priority;
};
bubuko.com,布布扣

这样一看,藐视程序该做的赋值工作都做了,PriorityCustom的copy函数好像把要复制的工作都做了。

错!请再看一眼。

这样复制的话就有派生类的内容被复制了,而基类的内容却没有复制过去。因为这个复制过程没有调用过基类的copy函数,这样做的话复制完基类内容将是初始化状态。

怎么做呢?派生类复制过程确保基类copy函数也被调用。

bubuko.com,布布扣
class PriorityCustom:public Custom   //派生类
{
    public:
    PriorityCustom(const PriorityCustom& p):Custom(p),priority(p.priority)
    {
        logCall("PriorityCustom copy constructor!")
    }
    PriorityCustom& operator=(const PriorityCustom& p)
    {
        logCall("PriorityCustom copy assignment operator!")
        Custom::operator=(p);
        priority=p.priority;
        return *this;
    }
    private :
        string  priority;
};
bubuko.com,布布扣

注意:

当你写一个copying函数,请确保:

1、复制所有local成员变量。

2、调用所有基类内的适当copying函数。

C++复制对象时勿忘每一部分,布布扣,bubuko.com

C++复制对象时勿忘每一部分

原文:http://www.cnblogs.com/kane0526/p/3611881.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!