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 构造函数只能在当前类中被触发

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clown_30

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值