C++,继承组合、隐藏、重写、虚函数、虚析构函数、抽象类

 

目录

一、继承与组合

二、初始化表总结

三、继承与组合相关的面向对象思想

四、隐藏

五、重写

六、虚函数

七、虚析构函数

八、抽象类

九、构造函数的访问权限修饰符--限制构造函数


一、继承与组合

       1、在B类中以A类的对象作为成员变量,称为类的组合(composition)。

       2、在组合时,一般在B类的构造函数初始化列表中要初始化A类(会调用A类的一个构造函数),如果没有初始化A类,则会调用A类中可以不传参数的构造函数。

       3、组合思想,使用于扩展部分,而不是本质部分 。

       4、本质是不变的,扩展为变化的。

二、初始化表总结

       1、为成员变量赋值

       2、指定基类的构造函数

       3、指定组合类的构造函数

       4、如果类C继承A类,组合B类,那么当创建C类对象时,调用构造函数的顺序是:  A   B   C

三、继承与组合相关的面向对象思想

1、什么时候使用单基继承?

    派生类是基类,或者说,基础包含子类时,使用单基继承

2、什么时候使用多基继承?

    一个类需要扮演多个不相关的角色时

3、继承与组合的区别?(继承和组合的优点和缺点?)

    继承优点:代码重用性高。

    继承的缺点:侵略性强,偶合性高。

    组合优点:松耦合(一个类的变化不会直接影响另一个类)、灵活性。

    继承缺点:代码编写量增加、重用性低。

4、组合的思想可有不足?

       重用性低。

5、修饰继承方式时,什么时候使用public、protected或private?

       当你希望基类的公有成员在派生类中仍然保持公有时,可以使用public继承

       当你希望基类的公有和保护成员在派生类中变为私有时,可以使用private继承

       当你希望基类的公有和保护成员在派生类中变为保护时,可以使用protected继承

6、修饰成员时,什么时候使用public、protected或private?

       成员被声明为public时,它们可以在类的外部访问。

       成员被声明为protected时,它们可以在类的派生类中访问,但在类的外部不可见。

       成员被声明为private时,它们只能在类的内部访问,对外部和派生类都不可见。

7、什么时候使用组合?

       该类需要有变化、追加的功能。(have)

       代码复用: 当你需要重用已有的类的功能时,可以使用组合。通过将一个或多个对象包含在新的类中,可以使用这些对象的方法和属性,而不必继承它们。

8、何时需要重写虚函数:

       派生类对基类中的实现不满意时,就需要重写

四、隐藏

  1. 派生类中的成员函数与基类中的成员函数名字相同时,派生类的成员函数会屏蔽基类中同名的成员函数
  2. 派生类中的成员变量与基类中的成员变量同名时,派生类的成员变量会屏蔽基类中同名的成员变量
  3. 通过派生类对象、派生类对象指针、或派生类对象引用访问基类中被隐藏的成员时,要在成员前面加上"基类名::"
  4. 重写是隐藏的一种

五、重写

    派生类的成员函数与基类的成员函数的名字相同,参数相同,并且返回类型也相同或可以类型兼容,则称为派生类重写了基类函数,简称重写(重写是隐藏的一个特例)

重载、重写。

重载是发生在一个类里面的相同函数名之间的重载,

重写是发生在基类与派生类之间有一摸一样的函数定义时的重写。

六、虚函数

  • 基类的指针或引用可以指向派生类对象
  • 在声明函数时,在最前加上virtual,则该函数就是虚函数,基类的虚函数被派生类继承后仍是虚函数。
  • 派生类中可以重写基类的虚函数。重写虚函数时,那怕派生类中不加virtual,也会被认为是虚函数。
  • 对象指针访问重写的虚函数时, 那么被访问的虚函数是指针指向的对象所属类的函数(只看指向的对象所属的类)。而用指针访问重写的普通函数时,那么被访问的函数是指针类型所属类的函数(只看指针是什么类)  (引用和指针相同)
  • 何时需要重写虚函数:派生类对基类中的实现不满意时,就需要重写

普通函数看指针(引用),虚函数看对象

  • 虚函数可以实现动态关联
  • 对象指针和对象引用的总结:

七、虚析构函数

1、虚析构函数即:

声明析构函数前加virtual 修饰,如果将基类的析构函数声明为虚析构函数时,由    该基类所派生的所有派生类的析构函数也都自动成为虚析构函数。

2、基类指针pbase指向用new动态创建的派生类对象child时,用“delete pbase;”删除对象分两种情况

    • 第一,如果基类中的析构函数为虚析构函数,则会先删除派生类对象,再删除基类对象
    • 第二,如果基类中的析构函数为非虚析构函数,则只会删除基类对象,不会删除派生类对象,这样便出现了内存泄漏了。

3、虚析构函数的概念和用法很简单,但它在面向对象程序设计中却是很重要的技巧。专业人员一般都习惯声明虚析构函数,即使基类并不需要析构函数,也显式地定义一个函数体为空的虚析构函数,以保证在撤销动态分配空间时能得到正确的处理

八、抽象类

1、纯虚函数的定义:

    • 虚函数被初始化0的函数。声明纯虚函数的一般形式是

               virtual 函数类型函数名 (参数表列) = 0;

    • 纯虚函数没有函数体;
    • 最后面的“=0”并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”;

2、抽象类

    • 包含一个或一个以上纯虚函数的类就是抽象类。
    • 不能用抽象类创建对象,但是可以用抽象类派生出派生类。也可以用抽象类创建指针和引用来指向抽象类的派生类对象。
    • 抽象类的派生类可以把抽象类中成员变量和成员函数继承下了,包括纯虚函数也会被继承。
    • 抽象类的派生类可以实现抽象类的纯虚函数。如果抽象类的派生类没有把抽象类的纯虚函数实现完,那么这个派生类也是抽象类。
    • 纯虚函数被派生类实现以后即为虚函数

九、构造函数的访问权限修饰符--限制构造函数

  1. public修饰的构造函数可以在任可位置创建对象调用。
  2. protected修饰的构造函数只能被当前类或子类中创建对象调用。
  3. private修饰的构造函数只能被当前类创建对象调用, private修饰的类不能被继承。

(1) 创建对象的地方和派生类构造函数的地方可双触发构造函数的执行。

(2) public的构造函数被触发执行没有限制

(3) protected构造函数只能当前类和派生类中被触发

(4) private 构造函数只能在当前类中被触发

你可能感兴趣的:(c++,算法,开发语言)