目录
一、继承与组合
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、何时需要重写虚函数:
派生类对基类中的实现不满意时,就需要重写
四、隐藏
- 派生类中的成员函数与基类中的成员函数名字相同时,派生类的成员函数会屏蔽基类中同名的成员函数。
- 派生类中的成员变量与基类中的成员变量同名时,派生类的成员变量会屏蔽基类中同名的成员变量。
- 通过派生类对象、派生类对象指针、或派生类对象引用访问基类中被隐藏的成员时,要在成员前面加上"基类名::"
- 重写是隐藏的一种
五、重写
派生类的成员函数与基类的成员函数的名字相同,参数相同,并且返回类型也相同或可以类型兼容,则称为派生类重写了基类函数,简称重写(重写是隐藏的一个特例)
重载、重写。
重载是发生在一个类里面的相同函数名之间的重载,
重写是发生在基类与派生类之间有一摸一样的函数定义时的重写。
六、虚函数
- 基类的指针或引用可以指向派生类对象
- 在声明函数时,在最前加上virtual,则该函数就是虚函数,基类的虚函数被派生类继承后仍是虚函数。
- 派生类中可以重写基类的虚函数。重写虚函数时,那怕派生类中不加virtual,也会被认为是虚函数。
- 对象指针访问重写的虚函数时, 那么被访问的虚函数是指针指向的对象所属类的函数(只看指向的对象所属的类)。而用指针访问重写的普通函数时,那么被访问的函数是指针类型所属类的函数(只看指针是什么类) (引用和指针相同)
- 何时需要重写虚函数:派生类对基类中的实现不满意时,就需要重写
普通函数看指针(引用),虚函数看对象
- 虚函数可以实现动态关联
- 对象指针和对象引用的总结:
七、虚析构函数
1、虚析构函数即:
声明析构函数前加virtual 修饰,如果将基类的析构函数声明为虚析构函数时,由 该基类所派生的所有派生类的析构函数也都自动成为虚析构函数。
2、基类指针pbase指向用new动态创建的派生类对象child时,用“delete pbase;”删除对象分两种情况
-
- 第一,如果基类中的析构函数为虚析构函数,则会先删除派生类对象,再删除基类对象
- 第二,如果基类中的析构函数为非虚析构函数,则只会删除基类对象,不会删除派生类对象,这样便出现了内存泄漏了。
3、虚析构函数的概念和用法很简单,但它在面向对象程序设计中却是很重要的技巧。专业人员一般都习惯声明虚析构函数,即使基类并不需要析构函数,也显式地定义一个函数体为空的虚析构函数,以保证在撤销动态分配空间时能得到正确的处理
八、抽象类
1、纯虚函数的定义:
-
- 虚函数被“初始化”为0的函数。声明纯虚函数的一般形式是
virtual 函数类型函数名 (参数表列) = 0;
-
- 纯虚函数没有函数体;
- 最后面的“=0”并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”;
2、抽象类
-
- 包含一个或一个以上纯虚函数的类就是抽象类。
- 不能用抽象类创建对象,但是可以用抽象类派生出派生类。也可以用抽象类创建指针和引用来指向抽象类的派生类对象。
- 抽象类的派生类可以把抽象类中成员变量和成员函数继承下了,包括纯虚函数也会被继承。
- 抽象类的派生类可以实现抽象类的纯虚函数。如果抽象类的派生类没有把抽象类的纯虚函数实现完,那么这个派生类也是抽象类。
- 纯虚函数被派生类实现以后即为虚函数
九、构造函数的访问权限修饰符--限制构造函数
- public修饰的构造函数可以在任可位置创建对象调用。
- protected修饰的构造函数只能被当前类或子类中创建对象调用。
- private修饰的构造函数只能被当前类创建对象调用, private修饰的类不能被继承。
(1) 创建对象的地方和派生类构造函数的地方可双触发构造函数的执行。
(2) public的构造函数被触发执行没有限制
(3) protected构造函数只能当前类和派生类中被触发
(4) private 构造函数只能在当前类中被触发
本文详细探讨了面向对象编程中的继承与组合概念,涉及初始化表、单基/多基继承的选择、继承与组合的区别、虚函数、抽象类、重写和隐藏机制,以及构造函数的访问权限管理。
1417

被折叠的 条评论
为什么被折叠?



