多重继承
定义:一个子类可以同时继承多个父类的属性和方法:
核心定义 :多重继承是面向对象编程(OOP)中的一种特性,指一个子类可以同时继承多个父类的属性和方法,相当于一个孩子同时继承了爸爸、妈妈甚至更多长辈的特征。
特点:子类可以从多个父类中继承成员变量和成员函数;
需要注意同名成员的冲突问题;
多重继承的语法格式
第一种方式(推荐):
class基类类名10:
class基类类名2:
class子类类名:继承方式基类类名1,继承方式基类类名2{}:
第二种方式:
class基类类名1:
class基类类名2:
class子类类名:继承方式基类类名1,基类类名2{:
#include <iostream> using namespace std; // 自定义基类Base class Base{ public: int value; // Base类的公共成员变量 }; // 自定义基类Base1 class Base1{ public: int value; // Base1类的公共成员变量,与Base类中的成员变量同名 }; // 自定义子类Son1,采用多继承方式,同时继承Base和Base1类 // 语法:class 子类名 : 继承方式1 基类名1, 继承方式2 基类名2, ... class Son1:public Base,public Base1{ public: void print(){ // 注意:直接访问value会产生二义性错误,因为两个基类都有同名成员 // 编译器无法确定应该访问Base::value还是Base1::value // cout << "value=" << value << endl; // 这行代码会编译错误 // 解决方法:使用"类名::"作用域限定符明确指定访问哪个基类的成员 Base::value = 100; // 访问并修改Base类中的value cout << "Base::value=" << Base::value << endl; // 输出Base类中的value Base1::value = 200; // 访问并修改Base1类中的value cout << "Base1::value=" << Base1::value << endl; // 输出Base1类中的value } }; int main(){ // 实例化子类Son1的对象s1 Son1 s1; // 调用子类的print方法 s1.print(); return 0; }链式继承
链式继承:
是指子类依次从多个父类继承,形成一条链条状的继承结构;
每个子类只继承一个直接父类,但通过多层继承关系,可以间接访问更上层基类的成员:
语法格式:
class A {};
class B:public A{};
class C:public B (){};
链式继承,简单来说就是子类继承父类,这个父类又继承另一个更高层级的父类,形成一条 “链条式” 的继承关系。就像家族的辈分传承:孙子 → 父亲 → 爷爷 → 曾祖父,每一层都能继承上一层的特征,也能新增自己的特征。
#include <iostream> using namespace std; // 基类A:定义了最基础的保护成员变量 class A { protected: // 保护访问权限:派生类可访问,外部不可访问 int pro_A; // 基类A的保护成员变量 }; // 派生类B:公有继承自基类A,同时作为类C的基类(中间层基类) class B : public A // public继承方式:基类的public/protected成员在派生类中保持原访问级别 { public: // 打印函数:访问继承自A的pro_A和自己的pro_B void print(){ cout << "pro_A=" << pro_A << endl; // 可直接访问继承自A的保护成员 cout << "pro_B=" << pro_B << endl; // 访问自己的保护成员 } protected: int pro_B; // 类B自己的保护成员变量 }; // 派生类C:公有继承自中间基类B,形成A→B→C的多级继承链 class C : public B { public: // 重写print函数:访问从A、B继承的保护成员以及自己的保护成员 void print(){ // 为三个层次的保护成员赋值 pro_A = 111; // 可直接访问来自A的保护成员(通过B间接继承) pro_B = 222; // 可直接访问来自B的保护成员 pro_C = 333; // 访问自己的保护成员 // 输出三个保护成员的值 cout << "pro_A=" << pro_A &l