当前位置: 首页 > news >正文

西嘎嘎学习 - C++ 继承 - Day 10

1  什么是继承

        继承是面向对象编程中的一个重要特性,它允许一个类(派生类)从另一个类(基类)中继承属性和方法,可以实现代码的复用,提高开发效率。

2  基类与派生类

        基类:被继承的类,也叫父类。

        派生类:继承基类的类,也叫子类。

#include <iostream>
using namespace std;// 基类
class Animal {
public:void eat(){cout << "Animal is eating" << endl;}
};// 派生类
class Dog : public Animal {
public:void bark(){cout << "Dog is barking" << endl;}
};int main()
{Dog myDog;myDog.eat();     // 继承自 AnimalmyDog.bark();    // Dog 自己的方法return 0;
}

        输出:

Animal is eating.
Dog is barking.

3  访问控制和继承

        在继承中,访问控制非常重要,它决定了派生类如何访问基类的成员。

(1)基类成员的访问权限

        基类中的成员可以是:

          1.public:公共成员,可以被派生类访问。

          2.protected:受保护成员,只能被派生类访问。

          3.private:私有成员,不能被派生类访问。

  (2)继承方式(访问控制符)

        继承时可以指定继承方式,这会影响基类成员在派生类中的访问权限。

基类成员public 继承protected 继承private 继承
publicpublicprotectedprivate
protectedprotectedprotectedprivate
private不可访问不可访问不可访问
#include <iostream>
using namespace std;class Base {
public:int publicVar;
protected:int protectedVar;
private:int privateVar;
};class Derived : public Base {
public:void accessMembers() {publicVar = 1;        // 允许protectedVar = 2;     // 允许// privateVar = 3;   // 错误!private成员不可访问}
};int main() {Derived d;d.publicVar = 10;         // 允许// d.protectedVar = 20;  // 错误!protected成员在类外不可访问return 0;
}

4  继承类型

        1.public 继承(共有继承):最常用,基类的 public 成员在派生类中仍为 public。

        2.protected 继承:基类的 public 和 protected 成员在派生类中都变为 protected。

        3.private 继承:基类的 public 和 protected 成员在派生类中都变为 private。

        示例(public 继承):

#include <iostream>
using namespace std;class Base {
public:void show(){cout << "Base class" << endl;}
};class Derived : public Base {// 继承 Base 的所有 public 成员
};int main()
{Derived d;d.show();   // 正确调用return 0;
}

5  多继承

        从多个基类继承,称为多继承。

        语法:

class Derived : public Base1 ,public Base 2 {// ...
};

        示例:

#include <iostream>
using namespace std;class Animal {
public:void eat(){cout << "Animal is eating" << endl;}
};class Mammal {
public:void breathe(){cout << "Mammal is breathe." << endl;}
};class Dog : public Animal, public Mammal {
public:void bark(){cout << "Dog is barking" << endl;}
};int main()
{Dog myDog;myDog.eat();    // 继承自 animalmyDog.breathe();    // 继承自mammalmyDog.bark();   // Dog 自己的方法return 0;
}

6  继承中的构造函数和析构函数

  (1)构造函数调用顺序

        1.基类构造函数 -> 派生类构造函数

        2.如果是多继承,基类构造函数按声明顺序调用

#include <iostream>
using namespace std;class Base {
public:Base(){cout << "Base constructor" << endl;}
};class Derived : public Base {
public:Derived(){cout << "Derived constructor" << endl;}
};int main()
{Derived d;return 0;
}

  (2)析构函数调用顺序

        与构造函数相反:派生类析构函数 -> 基类析构函数

7  虚继承

        在多继承中,如果两个基类都继承自同一个类,可能会导致菱形继承问题。

        示例(菱形继承):

class A {
public:int x;
};class B : public A {};
class C : public A {};
class D : public B, public C {};

        此时,D 有两个 x,一个来自 B,一个来自 C,容易出错。

        解决方法:使用 virtual 继承:

class A {
public:int x;
};class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {};

        这样,D 就只有一个 x,避免了重复继承。

8  总结

概念说明
继承派生类从基类继承属性和方法
基类被继承的类
派生类继承基类的类
访问控制public、protected、private
继承方式public、protected、private 继承
多继承一个类继承多个基类
虚继承解决菱形继承问题


文章转载自:

http://v73o9vIE.msxhb.cn
http://A5qwPCBC.msxhb.cn
http://7nSR2tRd.msxhb.cn
http://LZvrFCwt.msxhb.cn
http://rGXOgWTQ.msxhb.cn
http://QoV96Ow5.msxhb.cn
http://vtddK6Ty.msxhb.cn
http://X4RlPpCd.msxhb.cn
http://9tDkV9aU.msxhb.cn
http://JOoSbl8F.msxhb.cn
http://bI2W4zuY.msxhb.cn
http://ndyxmudY.msxhb.cn
http://vE9CAc8T.msxhb.cn
http://ssEGh8Mr.msxhb.cn
http://MR6slPZL.msxhb.cn
http://oxmHnobx.msxhb.cn
http://sDSCTkfc.msxhb.cn
http://aGSJxbIh.msxhb.cn
http://HRn2pBLD.msxhb.cn
http://hpGtsOQR.msxhb.cn
http://jH4WM2BY.msxhb.cn
http://9zvMxku3.msxhb.cn
http://jYK5fxyo.msxhb.cn
http://RwL4aXl8.msxhb.cn
http://5vDOOi4L.msxhb.cn
http://sbnCzZoM.msxhb.cn
http://I3iliZRt.msxhb.cn
http://f6HcdgFg.msxhb.cn
http://X962r4zT.msxhb.cn
http://9c9g0RFm.msxhb.cn
http://www.dtcms.com/a/378404.html

相关文章:

  • 图像直方图,直方图均衡化和掩膜
  • react reducx的使用
  • 基于STM32设计的智慧路灯(华为云IOT)_281
  • 智慧水库综合管理系统平台御控物联网解决方案
  • react基础篇
  • 子数组最大累加和dp问题I(保姆级!)
  • Win10和Win11打开IE浏览器
  • 解锁Python超能力:面向对象编程之类继承完全指南
  • 【openGLES】纹理
  • 什么是OCSP装订(OCSP Stapling)?它如何加速SSL握手?
  • 微硕WINSOK MOS管WSF3089,赋能汽车转向系统安全升级
  • Matplotlib 动画显示进阶:交互式控制、3D 动画与未来趋势
  • 立体校正原理
  • CAD球体密堆积_圆柱体试件3D插件 球体颗粒在圆柱容器内的堆积建模
  • 西门子 S7-200 PLC SMART 模拟量指令库(Scale)添加与实战使用指南
  • 后端Web实战-Spring原理
  • 计算机网络---内网穿透
  • QTDay1 图形化界面
  • Flutter 中的 Isolate
  • 将容器连接到默认桥接网络
  • 探索AI工具宝库:Awesome AI Tools - 让AI成为你的超级助手
  • UEC++学习(十八)使用TAutoConsoleVariable<T> / FAutoConsoleCommand自定义控制台变量/命令
  • 2.9Vue创建项目(组件)的补充
  • MasterGo蒙版
  • 一次.dockerignore设置错误导致的docker build排查
  • 第六节,探索 ​​CSS 的高级特性、复杂布局技巧、性能优化以及与现代前端工作流的整合​​
  • Flink on YARN 实战问题排查指南(精华版)
  • Java全栈学习笔记34
  • 进程控制(1)
  • 操作系统进程管理——同步与互斥的基本概念