赋值兼容性
在任何需要基类对象的地方都可以用公有派生类的对象来代替,这条规则称赋值兼容规则。
它包括以下情况:
- 派生类的对象可以赋值给基类的对象,这时是把派生类对象中从对应基类中继承来的成员赋值给基类对象。反过来不行,因为派生类的新成员无值可赋。
- 可以将一个派生类的对象的地址赋给其基类的指针变量,但只能通过这个指针访问派生类中由基类继承来的成员,不能访问派生类中的新成员。同样也不能反过来做。
- 派生类对象可以初始化基类的引用。引用是别名,但这个别名只能包含派生类对象中的由基类继承来的成员。
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){
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);
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) 编辑 收藏 引用