CC++继承
# C/C++: 继承
语法:
// class 子类 : 继承方式 父类
class CppPage : public BasePage
{
}
# 继承方式
- 公共继承
- public -> public
- protected -> protected
- private 不可访问
- 保护继承
- public -> protected
- protected -> protected
- private 不可访问
- 私有继承
- public -> private
- protected -> private
- private 不可访问
父类中所有非静态成员都会被子类继承,私有成员被继承了,只是被隐藏访问不到
继承中先调用父类构造函数,在调用子类构造函数
# 继承同名成员处理方式
- 访问子类同名成员,直接访问即可
- 访问父类同名成员,需要加作用域
cout << "子类成员" << son.m_A << endl;
cout << "父类成员" << son.Base::m_A << endl;
调用同名成员函数同理。
同名静态成员处理方式,与非静态成员一样,其中不一样的见下方代码
// 通过类名访问静态成员
cout << "子类静态成员" << Son::m_A;
cout << "父类静态成员" << Base::m_A;
cout << "另一种父类静态成员访问方式" << Son::Base::m_A;
调用同名静态成员函数同理。
# 多继承语法
语法
// class 子类 : 继承方式 父类1, 继承方式 父类2
class CppPage : public BasePage, public BasePage2
{
}
# 菱形继承
存在如下情形,是一种菱形继承:
- 父类:动物
- 子类:羊
- 子类:驼
- 孙类:羊驼(多继承自羊和驼)
此时存在资源浪费的问题,即孙类继承了两份父类的资源。
为了解决这个问题,可以利用虚继承
class Animal{int m_age;};
class Sheep : virtual public Animal {};
class Tuo : virtual public Animal {};
class SheepTuo : public Sheep, public Tuo {};
在SheepTuo
中会有两分别来自Sheep
和Tuo
类的vbptr
(虚基类指针)指向vbtable
(虚基类表),同时还有一个来自虚基类Animal
的m_age
。
在虚基类表中是存放有偏移量,两个vbptr
均指向虚基类Animal
的m_age
,因而节省了资源。
// 虚继承后可以使用三种方式对资源进行访问
SheepTuo st;
st.Sheep::m_age = 1;
st.Tuo::m_age = 2;
st.m_age = 3;
编辑 (opens new window)
上次更新: 2023/08/09, 13:21:24