#何为抽象类:
1. 在C++中,含有纯虚函数的类称为抽象类,它不能生成对象,且不能实例化对象,但是可以实例化指针;
2. 纯虚函数:virtual void lock()=0;若没有=0,则为一个虚函数
3. 实例化:在面向对象的编程中,把用“类创建对象的过程”称为实例化;将一个抽象的概念类,具体到该类实物的过程
形式:类名 对象名=new 类名(参数1,参数2……)构成
C++三大特性
封装:
1.目的是为了增强安全性和简化编程,用户只需要通过外部接口以及特定的访问权限来使用类的成员
注意:::友元函数不是类的成员函数,相当于给类开了一个后门,可以访问其私有成员,破坏了其封装性,但是提高了程序的运行效率;
继承:
派生类把基类的所有成员都继承过来了,除了构造函数和析构函数
1.使代码可以复用
2.三个继承方式:public protect private
3.基类对象和派生类对象赋值转换
1)派生类对象可以赋值给基类的对象/指针/引用,但基类的对象不能赋值给派生类对象;基类的指针可以通过强制类型转换赋值给派生类的指针,但是基类的指针必须是指向派生类对象时才是安全的;
4.派生类的默认成员函数
. 1) 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认的构造函数,则必须在派生类构造函数的“初始化列表阶段”显示调用。
2) 派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。
3) 派生类的operator=必须要调用基类的operator=完成基类的复制。
4) 派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。因为这样才能保证派生类 对象先清理派生类成员再清理基类成员的顺序。即派生类对象析构清理先调用派生类析构再调基类的析构
5) 派生类对象初始化先调用基类构造再调派生类构造。
5.”隐藏“(重定义)---子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问;在子类成员中可以用基类::基类成员来显示访问;
6.友元关系不能被继承,也就是说基类友元不能访问子类私有和保护成员
7.解决菱形继承二义性和冗余问题
----1)访问明确化,如d.A::_name
2) 虚拟继承
![虚拟继承代码](https://img-blog.csdnimg.cn/20190816184119769.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0ODQwMDQ2,size_16,color_FFFFFF,t_70)
多态:通俗来说就是多种形态,具体点就是完成某个行为,当不同的对象区完成时会产生不同的状态
多态:分为动态多态和静态多态
静态多态:在编译期间的行为。例如函数重载
动态多态:在程序运行期间
1.可以使用户以相同的方式处理不同类型的对象;举个例子--买票,小孩半票,大人全票,军人优先
2. 多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为
3. 构成多态的条件:
1)必须通过基类的指针或者引用调用虚函数
2)被调用的函数必须是“虚函数”,且派生类必须对基类的虚函数进行“重写”
虚函数的重写(覆盖):
1)派生类中有一个跟基类“完全相同”的虚函数(返回值类型,函数名字,参数列表完全相同),称子类的虚函数重写了基类的虚函数
虚函数重写的两个例外:
1)协变-----派生类重写基类虚函数时,与基类虚函数“返回值类型不同”,即基类虚函数返回基类的指针或引用,派生类返回派生类的指针或引用
代码如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190816164956692.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0ODQwMDQ2,size_16,color_FFFFFF,t_70)
2) 析构函数重写----基类与派生类的析构函数的名字不一样,如果基类的析构函数为虚函数,此时派生类只要定义,无论是否加virtual关键字,都与基类的析构函数构成重写;
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190816170151695.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0ODQwMDQ2,size_16,color_FFFFFF,t_70)
C++11中override和final
1) final:修饰虚函数,表示该虚函数不能再被继承
一般形式: virtual void Drive() final {}
2)override: 检查派生类是否重写了基类某个虚函数。如果没有重写,则报错
一般形式:virtual void Drive() override {}
重载,重写(覆盖),重定义(隐藏)的区别:
1.重载:两个函数在同一作用域
功能类似的“同名函数”,这些同名函数的“形参列表”(参数个数/类型/顺序)必须不同
2.重写:两个函数分别在基类和派生类的作用域
两个函数必须是一模一样的虚函数
3.重定义:两个函数分别在基类和派生类的作用域
函数名相同,简单来说,如果两个基类和派生类的同名函数不构成重写就是重定义
C++三大特性
最新推荐文章于 2024-07-09 15:02:05 发布