面向对象思想(类和类之间关系),下面都是面向对象的一部分
1.继承Inheritance,表示is a
三种继承:public, private, protected
Struct _List_node: public _List_node_base
Base Class的析构函数必须为virtual function,否则会出现undfine behavior(先记住,后面会有理解的)
构造由内而外;子类有父类的东西,能够使用父类的函数
Derived的构造函数首先调用Base的default构造函数,然后再执行自己
如果不想使用父类的默认构造函数,那么就要手动写了
Derived::Derived(..):Base(){..}
析构由外而内
子类要执行自己,然后再调用Base的。
2.复合Composition:表示has a. A(Container) Has a B (Component)
生命周期同步,同一
Adapter:特例,B具备了强大功能,A实际上调用了B。就是只是修改了一个面貌;
构造和析构:
先调用内部Component的默认(必须是默认!)构造函数,然后再执行自己的
Container::Contaier():Component(){...} -->initialization list先执行-->Component()是编译器自己加上去的,但只能是默认构造函数,可以不写;如果调用的不是默认构造函数,要自己写
析构由外而内,首先执行自己,然后再调用Component
Container::~Container():{... ~Component()}
3.委托Delegation/Composition By reference A has a refernce points to B(即使是指针在传,但也必须说成reference)--->pointer to implementation (pimpl)
生命周期不是同步的
这样的手法可以使得可以修改B而不影响A的用户,另外可以实现共享,但是共享中其中一个要修改内容,要实现Copy On Write
Inheritance with Virtual Function
在任意成员函数前加virtual,就成了虚函数。
函数继承其实继承的是调用权
non-virtual: 不希望子类重新定义(override).
virtual:希望子类重新定义,并且函数自身有默认定义。
pure virtual:希望子类一定要重新定义(override),因为父类本身没有实现函数! pure function 后面有个=0!
关键动作用virtual,由子类重新定义(override),这种方式叫Template Method(设计模式之一)
对于做框架用virtual实现非常方便子类继承
Inheritance 和composition 复合关系下的构造和析构
子类继承父类,子类has a Component;先调用Base类,再调用Component,最后再创建子类.??(要自己实验做出来)
子类继承父类,父类has a Component:那么就需要先Component,再Base,然后创建子类!
Delegation + Inheritance
Subject has reference to many observers。observer可以被继承
Prototype:能够创建未来的子类!所有对象都必须通过原型(父类)来创建,不能通过子类直接创建!
子类继承父类后,自己创建自己类型的对象,并登记到父类(父类有空间,子类放进去)
-:private
#:protected
+:public(可以省略)
Design Patterns Explained Simply
类声明里面的static函数,static变量只是声明,不是定义(分配内存)。在类外全局域里面进行定义以分配内存!
在类里面可以声明一个类型是自己的类.(链表)
阅读(1917) | 评论(0) | 转发(0) |