C++基础5:C++三大特征封装、继承、多态

1、封装

该隐藏的隐藏,该公开的公开,public、private、protected
作用:便于分工和共同开发,防止不必要的扩展



2、继承

作用:代码和数据的复用,在已有的数据和代码上进行扩展

2.1 继承的方式
公开继承:class A:public B{};
保护继承:class A:protected B{};
私有继承:class A:private B{};


2.2 公开继承                                                       2.3 保护继承                                                     2.4 私有继承
父类的公开数据在子类中还是公开的            父类的公开数据在子类中是保护的                父类中的公开数据在子类中私有的
父类中的保护数据在子类中还是保护的        父类中的保护数据在子类中是保护的            父类中的保护数据在子类中是私有的
父类中的私有数据在子类中是隐藏的            父类中的私有数据在子类中是隐藏的            父类中的私有数据在子类中是隐藏的

2.4 继承中构造和析构的调用
构建子类对象时,一定会调用父类的构造函数,销毁子类对象时,一定会调用父类的析构函数,
析构函数的调用顺序和构造函数的调用顺序相反,先调用父类的构造函数,再调用子类的构造函数
先构造的后析构,后构造的先析构

2.5 子类默认调用父类的无参构造,当然也可以指定调用父类的哪个构造函数,使用初始化参数列表指定
子类不能继承父类的构造函数,析构函数,赋值运算符函数,拷贝构造函数,但是可以调用父类中的这些函数

2.6 名字隐藏
子类继承父类数据之后,如果提供了和父类数据同名的数据,则会把父类的数据隐藏掉

2.7 多继承
一个类可以继承多个父类,构建这个对象的顺序和和这个类的继承类的顺序有关,如果继承的数据不产生冲突,则可以直接调用,如果产生冲突,可以使用父类名作用域区分(父类::),使用名字隐藏机制,也可以解决

2.8 多继承代码的优化
先把父类中的共同成员抽取出来,放入一个更高层的类中,然后使用虚继承 继承最高层的类,对直接子类而言和普通继承的区别只是多出了一个指针,用来维护虚继承关系,对子类的子类而言,不在从父类中拷贝最高层的数据,而是直接访问最高层的类



3、多态

3.1 虚函数
虚函数就是在普通成员函数前加上 virtual修饰,一个类型如果有虚函数,则编译器提供一个指针,指向这个类型的虚函数表,虚函数表中的元素就是每个虚函数的地址,这个指针会存入对象的前四个字节

3.2 对虚函数的重写(over write)
函数重写:是针对虚函数重写要求 函数名相同,参数列表相同 ,返回值相同
名字隐藏:在子类中,出现和父类同名的数据,子类会覆盖父类的数据
函数重载:同一个作用域,函数名相同,参数列表不同

3.3 纯虚函数

virtual void fun(x,y) = 0

定义他是为了实现一个接口,起到一个规范的作用,规范继承这个的类必须实现这个函数


3.4 多态:当父类的指针(或引用)指向子类对象时,调用父类提供的虚函数,表现将会是子类中函数覆盖的实现,多态的基础是继承,虚函数是多态的关键,
函数覆盖是多态的必要条件

3.5 多态的原理
每一个类型都有自己类型对应的虚函数表,同类型的对象共享虚函数表,子类和父类的虚函数地址不同

【注意】如果一个父类类型的指针指向子类对象时,一定要确保父类类型中有虚函数,如果没有虚函数,则会把指向的对象识别为父类型对象

3.5 多态的使用
(1)作为函数的参数
(2)可以做到类型的通用
(3)可以在函数内部根据实际对象类型做出相应的动作(函数)
(4)函数返回值

3.6 虚析构函数
当父类对象指针指向了子类对象时,如果释放对象空间,则会调用父类的析构函数,不会调用子类的析构函数,
当父类中出现虚函数时,则应该在父类的析构函数前加virtual加以修饰


发布了69 篇原创文章 · 获赞 37 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/xi_gua_gua/article/details/59775139