c++(九)
c++继承
class Java:public BasePage //Java类继承基础类BasePage
{
public: //java中自己的部分
void content()
{
cout<<"Java学科视频"<<endl;
}
};
class 子类: 继承方式 父类
子类也叫派生类,派生类中的成员包含两大部分:一类是从基类中继承过来的,一类是自己增加的成员
父类也叫基类
继承方式:
公有继承
保护继承
私有继承
继承中的对象模型
父类中所有非静态成员属性都会被子类继承下去,父类的私有成员属性,是被编译器给隐藏了,因此是访问不到,但是确实被继承下去了
父类构造然后是子类构造 再之后是子类析构最后是父类析构
当子类和父类出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据呢?
~访问子类同名成员 直接访问即可
~访问父类同名成员 需要加作用域
父类和子类中都有成员函数m_A时,在主函数中定义一个Son s,cout<<s.m_A时输出的是子类的m_A的值,父类的m_A的访问通过s.Base::m_A
s.func() 调用的是子类中的同名func()函数,s.Base::func(); 调用的是父类中的func()函数
如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员函数如果想要访问到父类中被隐藏的同名成员函数,需要加作用域
继承中同名的静态成员的处理方式和非静态成员的处理方式一样,访问子类同名对象,直接访问即可;访问父类童名成员,需要加作用域
而且访问方式有两种
1.通过对象访问
Son s; s.m_A和s.Base::m_A
Son s; s.func()和s.Base::func();
2.通过类名访问
Son::m_A 父类中的Son::Base::m_A
Son::func() 父类中的Son::Base::func()
如果子类中出现和父类同名的静态成员函数,子类的同名静态成员会隐藏掉父类中所有同名静态成员函数如果想要访问到父类中被隐藏的同名静态成员函数,需要加作用域
允许一个类继承多个类
但是多继承可能会引发父类中有同名成员出现,需要加作用域加以区分 s.Base1::m_A 或者是s.Base2::m_A
实际开发中不建议使用多继承
菱形继承
两个派生类继承同一个基类
又有某个类同时继承两个派生类
这种继承称为菱形继承,或者钻石继承
但是这种情况通常会出现二义性 因为两个派生类中都会继承同一个基类中的成员变量
在某个类同时继承两个派生类时,基类的数据就会继承两次,会出现二义性,我们只需要一个就可以
利用虚继承可以解决菱形继承的问题,继承之前加上关键字virtual变为虚继承
class Sheep:virtual public Animal {}; Animal 类叫做虚基类 不会出现二义性
vbptr 虚基类指针 指向一个vbtable虚基类表 表中纪录偏移量可以找到唯一一个数据
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)