posts - 0,  comments - 0,  trackbacks - 0
赋值兼容性

在任何需要基类对象的地方都可以用公有派生类的对象来代替,这条规则称赋值兼容规则
它包括以下情况:

  • 派生类的对象可以赋值给基类的对象,这时是把派生类对象中从对应基类中继承来的成员赋值给基类对象。反过来不行,因为派生类的新成员无值可赋。
  • 可以将一个派生类的对象的地址赋给其基类的指针变量,但只能通过这个指针访问派生类中由基类继承来的成员,不能访问派生类中的新成员。同样也不能反过来做。
  • 派生类对象可以初始化基类的引用。引用是别名,但这个别名只能包含派生类对象中的由基类继承来的成员。

2、应用举例

【例8.5】赋值兼容规则与自定义的复制构造函数。在【例8.1】中如果自定义复制构造函数,要利用赋值兼容规则。(查看详细源代码

  • 拷贝构造函数如下:
    Person::Person(Person &ps)
    {
    strcpy(IdPerson,ps.IdPerson);
    if(ps.Name!=NULL)
    {
    Name=new char[strlen(ps.Name)+1];
    strcpy(Name,ps.Name);
    }
    else Name=NULL;
    Sex=ps.Sex;
    Birthday=ps.Birthday;
    if(ps.HomeAddress!=NULL)
    {
    HomeAddress=new char[strlen(ps.HomeAddress)+1];
    strcpy(HomeAddress,ps.HomeAddress);
    }
    else HomeAddress=NULL;
    }

    Student::Student(Student &Std):Person(Std){
    //按赋值兼容规则Std可为Person实参
    strcpy(NoStudent,Std.NoStudent);
    for(int i=0;i<30;i++){
    if(Std.cs[i].coursename!=NULL){
    cs[i].coursename=new char[strlen(Std.cs[i].coursename)+1];
    strcpy(cs[i].coursename,Std.cs[i].coursename); }
    else cs[i].coursename=NULL;
    cs[i].grade=Std.cs[i].grade; } }

  • 重载的拷贝赋值操作符如下:
    Person & Person::operator=(Person &ps){
    copy(ps);
    //基类“=”重载函数中加拷贝函数可方便派生类重载“=”
    return *this;}

    void Person::copy(Person &ps)
    {
    strcpy(IdPerson,ps.IdPerson);
    if(ps.Name!=NULL)
    {
    delete[]Name;
    //赋值要先清原来分配的空间
    Name=new char[strlen(ps.Name)+1];
    strcpy(Name,ps.Name);
    }
    else Name=NULL;
    Sex=ps.Sex;
    Birthday=ps.Birthday;
    if(ps.HomeAddress!=NULL)
    {
    delete[ ]HomeAddress;
    //赋值要先清原来分配的空间,再重新分配
    HomeAddress=new char[strlen(ps.HomeAddress)+1];
    strcpy(HomeAddress,ps.HomeAddress);
    }
    else { delete[ ]HomeAddress;HomeAddress=NULL;}
    }

    Student & Student::operator=(Student &Std)
    {
    copy(Std);
    //按赋值兼容规则Std可为实参
    strcpy(NoStudent,Std.NoStudent);
    for(int i=0;i<30;i++)
    {
    if(Std.cs[i].coursename!=NULL)
    {
    delete [] cs[i].coursename;
    //拷贝要先清原来分配空间,再重新分配
    cs[i].coursename= new char[strlen(Std.cs[i].coursename)+1];
    strcpy(cs[i].coursename,Std.cs[i].coursename);
    }
    else cs[i].coursename=NULL;
    cs[i].grade=Std.cs[i].grade;
    }
    return *this;
    }

  • 深拷贝和浅拷贝由打印程序是看不出来的,不过浅拷贝具有潜在的错误。
posted on 2009-06-22 22:43 豆芽小文 阅读(745) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理



<2026年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿

文章档案(4)

搜索

  •  

最新评论