1.private继承时在子类中不可见
pretected 对于外界访问属性来说,等同于私有,但可以派生类中可见。
public 作用:传承接口 间接的传承了数据(protected)
protected 作用:传承数据,间接封杀了对外接口
private 统杀了数据和接口
如果多级派生当中,均采用 public,直到最后一级,派生类中均可访问基类的public,protected 成员
如果多级派生当中,均采用 private,直到最后一级,派生类中基类的所有成员均变为不可见
如果多级派生当中,均采用 protected,直到最后一级,派生类的基类的所有成员即使可见,也均不可被类外调用
2.继承时主要用初始化列表初始化父类
3.派生类的拷贝构造
派生类::派生类(const 派生类& another)
:基类(another),派生类新成员(another.新成员)
{
}
//子类对象可以用来初始化父类对象,Student(another)
Gaduate::Graduate(const Graduate & another)
:Student(another),salary(another.salary)
{ }
派生类中的默认拷贝构造器会调用父类中默认或自实现拷贝构造器,若派生类中自实现拷贝构造器,则必须显式的调用父类的拷贝构造器。
4.派生类的赋值运算符重载
赋值运算符函数不是构造器,所以可以继承
子类& 子类::operator=(const 子类& another)
{
if(this == &another)
return *this; //防止自赋值
父类::operator =(another); // 调用父类的赋值运算符重载
this->salary = another.salary;//子类成员初始化
return * this;
}
5.友元不会被继承
所以我们可以将派生类的指针或引用强制类型转为基类的指针或引用。这样可以显示调用基类的友元函数。
ostream &operator<<(ostream & out, Graduate & gra)
{
out<<(Student&)gra<<endl;
out<<gra.c<<"**"<<gra.d<<endl;
}
6.继承语法
派生类名::派生类名(参数总表)
:基类名 1(参数表 1),基类名(参数名 2)…基类名 n(参数名 n),
内嵌子对象 1(参数表 1),内嵌子对象 2(参数表 2)…内嵌子对象 n(参数表 n)
{
派生类新增成员的初始化语句;
}
先基类,再内嵌子对象,再新增成员。
析构时是相反的顺序