【C++学习手札】一文带你初识C++继承

                                         

                                        食用指南:本文在有C基础的情况下食用更佳  

                                       本文前置知识: C++类 

                                       ♈️今日夜电波:napori—Vaundy

                                                                1:21 ━━━━━━️──────── 3:23
                                                                       ◀️   ⏸   ▶️    ☰ 

                                      关注点赞收藏您的每一次鼓励都是对我莫大的支持 


目录

一、继承和派生的概述

 二、继承的语法

派生类定义格式:

继承方式分类:

基类个数分类:

派生类继承基类的规则 :

三、继承中的构造函数和析构函数

构造和析构的顺序

  子类中的构造(重要)

知识点1:

 知识点2:

四、父类和子类的同名处理

成员变量的处理

 成员函数的处理


一、继承和派生的概述

        在C++中,继承是一种对象-oriented编程(面向对象编程)的概念,它允许创建一个新的类(称为派生类)从一个现有的类(称为基类)继承属性和行为。通过继承,派生类可以获得基类的成员变量、成员函数和其他特性。

        继承有几种类型:公有继承、私有继承和受保护的继承。在公有继承中,基类的公有成员在派生类中仍然是公有的;在私有继承中,基类的公有成员在派生类中变为私有的;在受保护的继承中,基类的公有成员在派生类中变为受保护的。

        派生类可以通过继承来扩展基类的功能,它可以添加新的成员变量和成员函数,也可以重写基类的成员函数以改变其行为。派生类还可以访问基类的非私有成员。

        继承的优点:减少代码的冗余 提高代码的重用性

         一图让你认识继承和派生的概念~

【C++学习手札】一文带你初识C++继承_第1张图片


 二、继承的语法

派生类定义格式:

        注意以下两个格式都是一样的,定义以及意义都是相同的!


class 子类: 继承方式 父类名{

 //子类新增的数据成员和成员函数

 };


Class 派生类名 : 继承方式 基类名{

 //派生类新增的数据成员和成员函数

 };

继承方式分类:

        public : 公有继承 (重要)
        private : 私有继承
        protected : 保护继承

基类个数分类:


单继承:指每个派生类只直接继承了一个基类的特征 (一个父类 派生出 一个子类)
多继承:指多个基类派生出一个派生类的继承关系,多继承的派生类直接继承了不止一个基
类的特征(多个父类 派生出 一个子类)
 

注意:
        子类继承父类,子类拥有父类中全部成员变量和成员方法(除了构造和析构之外的成员方法),但是在子类中,继承的成员并不一定能直接访问,不同的继承方式会导致不同的访问权限。

派生类继承基类的规则 :

【C++学习手札】一文带你初识C++继承_第2张图片

         一图让你理解~

【C++学习手札】一文带你初识C++继承_第3张图片


三、继承中的构造函数和析构函数

构造和析构的顺序

class Other
	 {
 public:
	 Other()
		 {
		 cout << "对象成员的构造函数" << endl;
		 }
	 ~Other()
		 {
		 cout << "对象成员的析构函数" << endl;
		 }
	 };
 class Base {
 public:
	 Base()
		 {
		 cout << "父类的无参构造函数" << endl;
		 }
	 ~Base()
		 {
		 cout << "父类中的析构函数" << endl;
		 }
	
};
 class Son :public Base
 {
 public:
	 Son()
		 {
		 cout << "子类的无参构造" << endl;
		 }
	 ~Son()
		 {
		 cout << "子类中的析构函数" << endl;
		 }
	
		 Other ob;//对象成员
	
		 };
 void test01()
 {
	 Son ob1;
  }

        运行结果如下:

【C++学习手札】一文带你初识C++继承_第4张图片

         一图让你理解~

【C++学习手札】一文带你初识C++继承_第5张图片

  子类中的构造(重要)

        先看以下代码:

        父类

class Base
	 {
 private:
	 int a;
 public:
	Base()
	{
	 cout << "父类的无参构造函数" << endl;  
	}
	 Base(int a)
		 {
		 this-> a = a;
		 cout << "父类的有参构造函数" << endl;
		 }
	 ~Base()
		 {
		 cout << "父类中的析构函数" << endl;
		 }
	 };

知识点1:

        子类会默认调用 父类的 无参构造

        子类1:

 class Son :public Base
 {
 private:
	 int b;
 public:
	 Son()
	 {
		 cout << "子类的无参构造" << endl;
	 }
	 Son(int b)
	 {
		 this->b = b;
		 cout << "子类的有参构造函数int" << endl;
	 }

	 ~Son()
	 {
		 cout << "子类中的析构函数" << endl;
	 }
 };

 void test01()
 { 
	 Son ob1(10);
 }

        运行结果:

【C++学习手札】一文带你初识C++继承_第6张图片

 知识点2:

        子类 必须显示 使用初始化列表 调用 父类的有参构造

         子类2:

 class Son :public Base
 {
 private:
	 int b;
 public:
	 Son()
		 {
		 cout << "子类的无参构造" << endl;
		 }
	 Son(int b)
		 {
		 this-> b = b;
		 cout << "子类的有参构造函数int" << endl;
		 }
	
		 //子类必须用 初始化列表 显示的调用父类的有参构造
		 //父类名称(参数)
		 Son(int a, int b) :Base(a)//显示的调用父类的有参构造
		 {
		 this-> b = b;
		 cout << "子类的有参构造函数 int int" << endl;
		 }
	 ~Son()
		 {
		 cout << "子类中的析构函数" << endl;
		 }
	 };


 void test01()
 { 
	//子类 默认 会调用 父类的无参构造
	//子类必须用 初始化列表 显示的调用父类的有参构造
	//父类名称+()
	Son ob2(10, 20);

 }

        运行结果:

【C++学习手札】一文带你初识C++继承_第7张图片


四、父类和子类的同名处理

成员变量的处理

        1、当 父类和子类 成员变量同名时 在子类就近原则 选择本作用域的子类成员
        2、如果在子类中 必须使用父类中的同名成员 必须加上父类的作用域。

         栗子:

class Base
	 {
	 //父类的私有数据 一旦涉及继承 在子类中不可见
 public:
	 int num;
 public:
	 Base(int num)
		 {
		 this-> num = num;
		 cout << "Base有参构造int" << endl;
		 }
	 ~Base()
		 {
		 cout << "析构函数" << endl;
		 }
	 };

 class Son :public Base
 {
 private:
	 int num;
 public:
	 Son(int num1, int num2) :Base(num1)
		 {
		 this-> num = num2;
		 cout << "有参构造int int" << endl;
		 }
	
		 ~Son()
		 {
		 cout << "析构函数" << endl;
		 }
	 void showNum(void)
		 {
		 //如果在子类中 必须使用父类中的同名成员 必须加上父类的作用域
			 cout << "父类中的num = " << Base::num << endl; 
			 //当 父类和子类 成员变量同名时 在子类就近原则 选择本作用域的子类成员
			 cout << "子类中的num = " << num << endl;
		 }
	 };

 void test01()
 {
	 Son ob1(10, 20);
	 ob1.showNum();
 }

        运行结果:

【C++学习手札】一文带你初识C++继承_第8张图片

 成员函数的处理

        1、子类继承父类所有成员函数 和成员变量

        2、一旦子类 实现了 父类的同名成员函数 将屏蔽所有父类同名成员函数

          栗子: 

class Base
	 {
 public:
	 void func(void)
		 {
		 cout << "父类中的void func" << endl;
		 }
	 void func(int a)
		 {
		 cout << "父类中的int func a = " << a << endl;
		 }
	 };

 class Son :public Base
 {
  public:
	 //一旦子类 实现了 父类的同名成员函数 将屏蔽所有父类同名成员函数
		 void func(void)
		 {
		 cout << "子类中voidfunc" << endl;
		 }
	 };
 void test01()
 {
	 //为啥构造和析构除外?父类的构造和析构 只有父类自己知道该怎么做(构造和析构 系统自动调用)
	 //子类会继承父类所有成员函数(构造和析构函数除外) 和成员变量
	 Son ob1;
	 ob1.func();
	 //ob1.func(10);//err //一旦子类 实现了 父类的同名成员函数 将屏蔽所有父类同名成员函数
		
		 //如果用户 必须要调用父类 的同名成员函数 必须加作用域
	 ob1.Base::func();//调用父类的void func
	 ob1.Base::func(10);//调用父类的int func
 }

        运行结果:

【C++学习手札】一文带你初识C++继承_第9张图片

         本文仅仅为对于C++中继承的基础知识,重要的还是在虚函数那一块,下一篇,我会详细的介绍虚函数!希望大家继续支持Thanks♪(・ω・)ノ


                感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o!  

                                 

                                                                 给个三连再走嘛~      

你可能感兴趣的:(C++修仙,筑基中,c++)