第九课、C++继承

封装:提高代码维护性 (遇到问题能够准确定位)。

继承:提高代码复用性(非ctrl+c ctrl+v,而是不做任何修改或操作源码就能实现代码的复用)。

多态:提高代码扩展性。

2、继承描述:(以下方示例2为例说明)

(1)A类是B类的父类,B是A的子类。

(2)A类是B类的基类,B类是A的派生类。

(3)继承的过程可视为拷贝。

3、继承语法声明:

      嵌入式面向对象程序开发·C++继承

 

4、复用方法(继承:提高代码复用性):(1)组合---has-a(2)继承---is-a

(1)组合(将一个类作为另一个类的对象成员)示例:

class A

{

    public:

        void print()

        {

            cout << "hello world" <<endl;

        }

}

};

class B

{

    public:

        A a;  //组合

        void func()

        {

            a.print();

        }

   }

};

(2)继承示例:

class A{…..};

class B : public A

{

    public:

        int m_num;

        int count;

        void func()

        {

            print();

        }

};

一、继承规则

常用public,protected/private一般用不到

嵌入式面向对象程序开发·C++继承

 

二、派生类

派生类:

         派生类实例化的对象大小 = 父类的对象大小 + 派生类的新成员大小。

覆盖:派生类拥有与基类相同的属性(成员变量)或方法(函数)时,派生类产生覆盖。

注:覆盖又称遮蔽(下面有详解)。

1、派生类的构造函数(执行顺序)

(1)基类继承而来的成员的初始化工作还是由基类构造函数完成派生类新增的成员在派生类的构造函数中初始化。若基类没有无参构造函数,那么派生类里所有构造函数都要显示调用基类的构造函数。

示例:

class A

{

    public:

        A()

        {

            cout << "A" << endl;

        }

 

        explicit A(int num) : m_num(num)

        {

            cout << "A int"  << endl;

        }

 

        ~A()

        {

            cout << "~A" << endl;

        }

 

        int m_num;

       

};

 

class B : public A

{

    public:

        B() : A()

        {

            cout << "B" << endl;

        }

 

        B(int count) : m_count(count),A(5)

        {

            cout << "B int" << endl;

        }

 

        int m_count;

};

    (2)构造函数调用顺序:

             基类(继承声明的顺序决定) -> 子对象(定义的顺序觉定)-> 派生类

             例如:继承声明:class B : public C,public A

             定义顺序:Test t;

                               Test2 t2;

          (析构函数与此相反)

 (1)基类中没有默认构造函数(或无参),那么在派生类的构造函数中必须显示调用基类构造函数,以初始化基类成员。

 (2)调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左到右)。

 (3)调用内嵌成员对象的构造函数,调用顺序按照它们在类中声明的顺序。

2、派生类成员函数

   (1)函数重载

   (2)函数遮蔽(覆盖)

      ①派生类成员函数与基类成员函数一摸一样,默认调用派生类的方法。

      ②解决方法:通过派生类对象访问基类的同名函数  对象名.基类名::函数名。

        示例:b.A::print();   //前提:B b; B是A的派生类,AB中均匀有void print()函数

相关文章:

  • 2021-06-05
  • 2021-09-29
  • 2021-12-29
  • 2021-08-12
  • 2022-12-23
  • 2021-04-13
猜你喜欢
  • 2021-06-14
  • 2021-06-20
  • 2021-05-07
  • 2021-12-24
  • 2022-01-18
  • 2021-09-08
  • 2022-12-23
相关资源
相似解决方案