您的位置:首页 > 编程语言 > C语言/C++

C++三大特性封装继承多态

2017-08-01 20:11 204 查看

C++的三大特性:
封装、继承、多态
封装:将一类事物所共有的属性和行为方法进行总结,封装在一个类中。该类的形成过程称为封装,该封装的类实例化的对象具有类的所有属性和行为方法。

封装的类的内部按照访问限定符可以分为:(public:)公有部分、(protected:)保护部分、(private:)私有部分。

继承:继承是把一个已经成型(封装好)的类继承到一个新形成的类中,一般将被继承的类称为父类(基类),主动继承的称为子类(派生类)。

继承的作用是为了实现代码的重用性。即父类的代码继承到子类任然可用。

继承分为:公有继承 、 保护继承 、 私有继承。

公有继承: (格式: class Derived:public Base)

父类的共有部分继承到子类的公有部分,父类的保护部分继承到子类的保护部分,父类的私有部分继承到子类的私有部分(父类的私有部分在子类不可访问)。

保护继承: (格式: class Derived:protected Base)

父类的共有部分继承到子类的保护部分,父类的保护部分继承到子类的保护部分,父类的私有部分继承到子类的私有部分(父类的私有部分在子类不可访问)。

私有继承: (格式: class Derived:private Base)

父类的所有都继承到子类的私有部分,父类的私有部分在子类不可访问。
多态:

什么是多态:

调用相同的接口,表现出不同的结果。

如何实现多态:

通过定义和重写虚函数,通过基类的指针或引用指向派生类对象,通过基类的指针或引用调用虚函数,实现接口的高度统一。简而言之就是调用相同的接口表现不同的结果。


什么是虚函数?



virtual 函数返回值 函数名(形参);

只有成员函数可以是虚函数。

虚函数就是允许派生类重写它。
函数重写:

1.返回值相同,函数名相同,参数相同,

2.派生类中的virtual关键字可有可无,但基类的函数必须有virtual关键字。

3.作用域不同,一个位于基类,一个位于派生类

基类的指针可以隐式类型转换成派生类对象的地址。反之不行。

基类的引用可以隐式类型转换成派生类对象的别名。反之不行。

抽象类:包含纯虚函数的类叫抽象类,抽象类无法实例化(无法定义对象)

纯虚函数只有声明,不需要基类中实现。

如何声明纯虚函数:

virtual 返回值类型 函数名(形参)=0;

纯虚函数被派生类继承以后,如果被派生类定义,派生类就不是抽象类,如果在派生类中没有定义纯虚函数,派生类也将变成抽象类。

覆盖(函数重写)、函数隐藏、函数重载的区别?

成员函数隐藏(也称重定义)

A、不在同一个作用域(分别位于派生类与基类)

B、函数名字相同

C、返回值可以不同

D、参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意与重载的区别)

E、参数相同,但是基类函数没有 virtual关键字。此时,基类的函数被隐藏(注意与覆盖的区别)
成员函数覆盖(override,也称重写)

是指派生类重新定义基类的虚函数,特征如下:

A、不同的作用域(分别位于派生类与基类)

B、函数名字相同

C、参数相同

D、基类函数必须有virtual关键字,不能有static

E、返回值相同

F、重写函数的权限访问限定符可以不同
成员函数重载(overload)

是指函数名相同,参数不同(数量、类型、次序),特征如下:

A、相同的范围(在同一个作用域中)

B、函数名字相同

C、参数不同

D、virtual 关键字可有可无

E、返回值可以不同

函数重写的原理:通过查虚函数表,来得到对象的虚函数的地址

虚析构

在析构函数前加virtual关键字有什么作用?

防止内存泄漏 (delete p的时候,如果析构函数是虚函数,这时只会看p所赋值的对象,如果对象是派生类的对象,就会调用派生类的析构函数

,如果p赋值的是基类的对象,就会调用基类的析构函数)

如果析构函数不是虚函数,在delete p,调用析构函数,只会看指针的数据类型,而不会看赋值的对象,所以,会有内存泄漏

explicit 关键字的用法:

只能修饰构造函数,防止单参数的构造函数隐式类型转换,把一个常量转换成一个对象。

在没有加explicit之前,可以把一个常量赋给一个对象。

推荐构造函数前最好加explict ,析构函数前最好加virtual进行修饰。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息