目录
1, 继承的语法
通过class 子类:继承方式 父类, 可实现继承
class A : public B
1-1, 继承方式
继承方式分为, public、private、protected, 通过继承方式可决定继承的属性在子类的权限
1-1-1, 公共继承public
通过public方式继承父类属性与父类保持一致, 即父类public的属性, 子类也是public, 父类protected属性, 子类也是protected属性
class Son1 :public Base1
{
public:
void func()
{
//m_a在父类中是public权限, 所以子类也是public权限, 可修改
m_a = 100;
//m_b在父类中是protected权限, 所以子类也是protected权限, 可修改
m_b = 200;
//m_c在父类中是private权限, 子类不能访问, 所以不能修改
m_c = 300;
}
};
1-1-2, 私有继承private
通过private方式继承父类属性, 在子类中都是private属性
class Son1 :private Base1
{
public:
void func()
{
//m_a在父类中是public权限, 所以子类也是private权限, 可修改
m_a = 100;
//m_b在父类中是protected权限, 所以子类也是private权限, 可修改
m_b = 200;
//m_c在父类中是private权限, 子类不能访问, 所以不能修改
m_c = 300;
}
};
1-1-3, 保护继承protected
通过protected方式继承父类属性, 在子类中都是protected属性
class Son1 :protected Base1
{
public:
void func()
{
//m_a在父类中是public权限, 所以子类也是protected权限, 可修改
m_a = 100;
//m_b在父类中是protected权限, 所以子类也是protected权限, 可修改
m_b = 200;
//m_c在父类中是private权限, 子类不能访问, 所以不能修改
m_c = 300;
}
};
说明:子类都不能访问父类的private权限属性
2, 父类,子类同名属性处理
2-1, 成员变量同名
当子类存在与父类同名的属性时, 通过对象.属性方式, 访问的是子类的属性, 要访问父类的属性, 需通过对象.父类::属性方式, 进行访问
//Base1是父类名称
cout << "子类属性访问m_a:" << s1.m_a << endl;
cout << "父类属性访问m_a:" << s1.Base1::m_a << endl;
2-2, 成员函数同名
当子类存在与父类同名的属性时, 通过对象.函数()方式, 访问的是子类的属性, 要访问父类的属性, 需通过对象.父类::函数()方式, 进行访问
//func()是子类父类同名的成员函数, Base1是父类名称
s1.func();
s1.Base1::func();
3, 多继承
通过class 子类:继承方式 父类1, ..., 继承方式, 父类n, 可实现多继承
//Base1, Base2为继承的基类
cout << "访问基类属性:" << s1.m_a << endl;
cout << "访问Base1属性:" << s1.Base1::m_a << endl;
cout << "访问Base2属性:" << s1.Base2::m_a << endl;
4, 菱形问题
通过虚继承的方式, 可解决菱形问题, 语法为class 子类:virtual 继承方式 父类1, virtual 继承方式 父类2
//加上virtual就表示虚继承, 可解决菱形问题
class C :virtual public A, virtual public B