diff --git a/README.md b/README.md index b0f5174..0918281 100644 --- a/README.md +++ b/README.md @@ -517,6 +517,22 @@ virtual int A() = 0; Data vall = { 0, "Anna" }; ``` +### 虚函数、纯虚函数 + +[CSDN . C++中的虚函数、纯虚函数区别和联系](https://blog.csdn.net/u012260238/article/details/53610462) + +* 类里如果声明了虚函数,这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的子类里面可以被覆盖,这样的话,这样编译器就可以使用后期绑定来达到多态了。纯虚函数只是一个接口,是个函数的声明而已,它要留到子类里去实现。 +* 虚函数在子类里面也可以不重载的;但纯虚函数必须在子类去实现。 +* 虚函数的类用于“实作继承”,继承接口的同时也继承了父类的实现。当然大家也可以完成自己的实现。纯虚函数关注的是接口的统一性,实现由子类完成。 +* 带纯虚函数的类叫虚基类,这种基类不能直接生成对象,而只有被继承,并重写其虚函数后,才能使用。这样的类也叫抽象类。抽象类和大家口头常说的虚基类还是有区别的,在C#中用abstract定义抽象类,而在C++中有抽象类的概念,但是没有这个关键字。抽象类被继承后,子类可以继续是抽象类,也可以是普通类,而虚基类,是含有纯虚函数的类,它如果被继承,那么子类就必须实现虚基类里面的所有纯虚函数,其子类不能是抽象类。 + + +### 虚函数指针、虚函数表 + +* 虚函数指针:在含有虚函数类的对象中,指向虚函数表 +* 虚函数表:在程序只读数据段(.rodate section),存放虚函数指针,如果派生类实现了基类的某个虚函数,则在虚表中覆盖原本基类的那个虚函数指针 + + ### 虚继承、虚函数 #### 虚继承 @@ -587,19 +603,39 @@ int main() 头文件:`#include ` -##### C++98 +#### C++98 ```cpp std::auto_ptr ps (new std::string(str)); ``` -##### C++11 +#### C++11 1. shared_ptr 2. unique_ptr 3. weak_ptr -4. auto_ptr +4. auto_ptr(被c++11弃用) +* Class shared_ptr 实现共享式拥有(shared ownership)概念。多个智能指针指向相同对象,该对象和其相关资源会在“最后一个reference被销毁”时被释放。为了在结构较复杂的情景中执行上述工作,标准库提供weak_ptr、bad_weak_ptr和enable_shared_from_this等辅助类。 +* Class unique_ptr 实现独占式拥有(exclusive ownership)或严格拥有(strict ownership)概念,保证同一时间内只有一个智能指针可以指向该对象。你可以移交拥有权。它对于避免内存泄漏(resource leak)——如new后忘记delete——特别有用。 + +##### shared_ptr + +多个智能指针可以共享同一个对象,对象的最末一个拥有着有责任销毁对象,并清理与该对象相关的所有资源。 + +##### weak_ptr + +weak_ptr 允许你共享但不拥有某对象,一旦最末一个拥有该对象的智能指针失去了所有权,任何weak_ptr都会自动成空(empty)。因此,在default和copy构造函数之外,weak_ptr只提供“接受一个shared_ptr”的构造函数。 + +##### unique_ptr + +unique_ptr 是C++11才开始提供的类型,是一种在异常是可以帮助避免资源泄漏的智能指针。采用独占式拥有,意味着可以确保一个对象和其相应的资源同一时间只被一个pointer拥有。一旦拥有着被销毁或编程empty,或开始拥有另一个对象,先前拥有的那个对象就会被销毁,其任何相应资源亦会被释放。 + +unique_ptr用于取代auto_ptr + +##### auto_ptr + +被c++11弃用,原因是缺乏语言特性如“针对构造和赋值”的std::move语义,以及其他瑕疵。 ### 强制类型转换运算符