继承
语法: class 子类(派生类) : 继承方式 父类(基类)
三种继承方式
- 公共继承
- 保护继承
- 私有继承
公共继承:
父类中的公共权限成员 到 子类中依旧是公共权限,父类中保护权限成员到子类中依然是保护权限,父类中私有权限成员到子类中访问不到.
保护继承:
父类中的公共权限成员 到 子类中是保护权限,父类中保护权限成员到子类中依然是保护权限,父类中私有权限成员到子类中访问不到
私有继承:
父类中公共成员 保护成员到子类中变成私有成员,类外访问不到,父类中私有成员,子类访问不到.
继承中的对象模型
问题:从父类继承过来的成员,哪些属于子类对象?
class base
{
public:
int ma;
protected:
int mb;
private:
int mc; //私有成员只是被隐藏了,但是还是会继承下去
};
//公共继承
class son: public base
{
public :
int md;
} ;
void test01()
{
// 4? 12 ? 16?
cout << "sizeof son =" << sizeof(son) << endl; //16
//父类中所有非静态成员属性都会被子类继承下去,父类中私有属性是被编译器隐藏,访问不到,但是依旧被继承.
}
int main()
{
test01();
}
继承中构造和析构的顺序
问题: 父类和子类的构造和析构顺序谁先谁后?
先构造父类,再构造子类;析构的顺序与构造的顺序相反.
同名成员处理方式
问题:当子类对象与父类出现同名函数,如何通过子类对象,访问到子类或者父类中同名的数据呢?
同名成员属性处理
- 访问子类同名成员 直接访问即可; son.ma;
- 访问父类中同名对象 需要加作用域; s.base::ma;
同名成员函数处理
同理,s.func();
s. base.func();
同名静态成员处理方式
问题: 继承中同名的静态成员在子类对象上如何进行访问?
静态成员和非静态成员出现同名,处理方法一致.
同名静态成员属性
1.通过对象访问
s.ma;
s.base::ma;
2.通过类名访问
son::ma;
son::base::ma; // 第一个::代表通过类名方式访问 第二个::代表访问父类作用域下
同名静态成员函数
1.通过对象访问
s.func();
s.base::func();
2.通过类名访问
son::func();
son :: base::func();
多继承语法
子类需要继承base1 和 base2
class son : public base1, public base2
当父类中出现同名成员,需要加作用域区分
s.base1::ma
s.base2::ma
菱形继承
概念:
两个派生类继承同一个基类
又有某个类同时继承这两个派生类
利用虚继承解决
//动物类 虚基类
class animal
{
public:
int mage;
}
// 羊类
class sheep: virtual public animal ();
//驼类
class tuo : virtual public animal();