《C++ Primer Plus》(第六版)笔记二
1.继承中的构造函数
派生类不能直接访问基类的私有成员,而必须通过基类的方法进行访问。因此,派生类构造函数必须使用基类构造函数
RatedPlayer类继承自TableTennisPlayer
通常情况
RatedPlayer::Ratedplayer(unsigned int r,const string &fn,
const string &n,bool ht):TableTennisPlayer(fn,ln,ht)
{
rating=r;
}
省略成员初始化列表
RatedPlayer::Ratedplayer(unsigned int r,const string &fn,
const string &n,bool ht)//what if no initializer list?
{
rating=r;
}
必须首先创建基类对象,如果不调用基类构造函数,程序将使用默认的基类构造函数,因此上述代码与下面的等效:
RatedPlayer::Ratedplayer(unsigned int r,const string &fn,
const string &n,bool ht)//:TableTennisPlayer()
{
rating=r;
}
除非要使用默认构造函数,否则应显式地调用正确的基类函数.
第三种情况
RatedPlayer::Ratedplayer(unsigned int r,const TableTennisPlayer & tp):TableTennisPlayer(tp)
{
rating=r;
}
由于tp 的类型为TableTennisPlayer & ,因此将调用基类复制构造函数。
也可以对派生类成员初始化列表语法,在这种情况下,应该在列表中使用成员名,而不是类名
RatedPlayer::Ratedplayer(unsigned int r,const TableTennisPlayer & tp):TableTennisPlayer(tp),rating(r)
{
}
小结
- 首先创建基类对象
- 派生类构造函数应通过成员初始化列表将基类信息传递给基类构造函数
- 派生类构造函数应初始化派生类新增的数据成员
释放对象的顺序与创建对象的顺序相反,即先执行派生类的析构函数,然后自动调用基类的析构函数
2.派生类与基类的特殊关系
派生类对象可以使用基类的方法,条件是方法不是私有的
- 基类指针可以在不进行显式类型转换的情况下指向派生类对象,反之不行
基类引用可以在不进行显式类型转换的情况下指向派生类对象,反之不行
RatedPlayer rplayer(1140,"Mallory","Duck",true);
TableTennisPlayer &rt=rplayer;
TableTennisPlayer *pt=&rplayer;
rt.name();//invoke name() with reference
pt->name();//invoke name() with pointer
基类引用或指针只能用于调用基类方法,因此,不能使用rt或pt调用派生类RestRanking方法.
虚函数
使用virtual时,如果方法是通过引用或指针而不是对象调用的,它将确定使用哪一种方法,如下
如果没有使用关键字virtual,程序将根据引用类型或指针类型选择方法,如果使用了virtual,程序将根据引用或指针指向的对象来选择方法.
方法在基类中被声明为虚的后,它在派生类中将自动成为虚方法
3.赋值运算符
不要将赋值与初始化混淆了,如果语句创建新的对象,则使用初始化,如果语句修改已有对象的值,则是赋值:
Star sirius;
Star alpha=sirius;//initialization(one notation)
Star dogstar;
dogstar =sirius;//assigment