持续更新中…
1.有个通用的使用多态、虚函数 的方法:
- 1.定义一个容器,其中的元素类型是基类,在容器中存入不同子类类型的指针。
- 2.不同子类中定义自己的接口虚函数。
- 3.当遍历该容器时,会根据该容器中的不同类型自动调用不同子类的接口函数。
2.如果增加
一个需求 或者 更改
一个需求很频繁时候
做法是:
- 1.先定义一个基类
Base_A
,在这个基类定义公共的一个接口虚函数
Func()
; - 2.再定义子类
Derived_B
、Derived_C
继承于这个基类Base_A
,在子类Derived_B
、Derived_C
中去具体实现这个需求的虚函数接口Func()
。 - 3.在另一个类
Class_C
中定义一个容器(以vector
容器为例)std::vector<Base_A*> Vct
,通过在容器Vct
中增加
或者修改
要使用的具体子类类型Derived_B
或Derived_C
的对象.
当遍历
该容器Vct
时,会根据该容器中的不同类型自动调用不同子类的接口函数Func()
。
3.区分组合和聚合的方法:生命周期是否一致。一致的是组合,不一致的是聚合。
中间的装饰器是为了提取公共代码???
4.单一职责原则:一个类只有一个变化的原因。
5.依赖倒置原则:应该依赖抽象,而不应该依赖实现细节。(李老师说了一句,这里的依赖指的是编译时依赖???)
6.面向接口编程:最简单的一个表现形式就是,变量要声明成 抽象基类。
只要是new出来的,都是实现细节,是细节依赖,紧耦合(依赖具体类)。Base *A=new Derived();这种做法违背依赖倒置原则。因为Base *A是抽象基类接口,而new Derived()带来的是细节依赖,紧耦合(依赖具体类)。—工厂模式讲解
7.虚函数就是延时到运行时!
虚函数就是把函数的调用延时到运行时确定!
8.C++的多态性分为两种:编译时的多态、运行时的多态; 使用重载来实现编译时的多态,使用虚函数来实现运行时的多态。
如果要用多态,就必须使用指针。
9.为什么多态必须使用指针?
答:参考博客 https://www.cnblogs.com/yinheyi/p/10525543.html
10.工厂模式里面讲到:设计模式不是把变化消灭掉了,而是把变化限定到了一个局部位置。
工厂模式里面就是,类 MainForm
的整体看上去没有依赖任何具体类,他里面实用的都是抽象类。 抽象类A* a = 抽象类B对象指针->createA();
其中 createA()
返回一个 抽象类A
的对象指针。我们通过在MainForm
的构造函数(或者它的接口函数)传入一个B
的具体子类指针,然后把该指针赋值给 抽象类B对象指针
。这样这个B
的具体子类并不在类 MainForm
中定义创造,而是通过参数传进来,就保证了类MainForm
中全部都是抽象的、稳定的
。
李老师的代码为了突出重点,new之后,都没有规范写delete,但是我们实际开发一定要记得写delete。不想写就使用智能指针shared_ptr声明类别变量,然后使用make_shared进行初始化。
11.多态只对于虚函数来说。
对于类中的非虚函数,不能通过 把子类对象赋值给基类对象,或者 把子类指针赋值给基类指针的方式,即,假设子类Derived
有一个func()
普通成员函数,基类Base
没有,不能通过Derived derived; Base base=derived; base.func()
或者 Base *base= new Derived();,base->func();
的方式来调用到子类的func
非虚函数(普通成员函数)。