C++知识点之四大特性与虚函数

483 阅读4分钟

简介

C++是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。

四大特性

封装

封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念。

优点:这样能避免受到外界的干扰和误用,从而确保了安全。

抽象

数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制。

优点: 私有部分对使用类型的代码隐藏了实现细节。

继承

类之间的一种关系,继承允许我们依据另一个类来定义一个类。

优点:更加容易创建和维护程序,也达到了重用代码功能和提高执行效率。

多态

多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。

静态多态是指在编译期间就可以确定函数的调用地址,并生产代码,这就是静态的,也就是说地址是早早绑定的,静态多态也往往被叫做静态联编。 静态多态往往通过函数重载模版来实现。

动态多态则是指函数调用的地址不能在编译器期间确定,必须需要在运行时才确定,这就属于晚绑定,动态多态也往往被叫做动态联编。动态多态通过虚函数继承关系来实现。

重载、重写和继承

动态多态实现的两个条件:

虚函数

一个基类的指针或引用指向派生类的对象

基类指针在调用成员函数(虚函数)时,就会去查找该对象的虚函数表。虚函数表的地址在每个对象的首地址。查找该虚函数表中该函数的指针进行调用。

每个对象中保存的只是一个虚函数表的指针,C++内部为每一个类维持一个虚函数表,该类的对象的都指向这同一个虚函数表。也就是说,编译器为每一个类维护一个虚函数表,每个对象的首地址保存着该虚函数表的指针,同一个类的不同对象实际上指向同一张虚函数表。

在类继承的时候,虚函数表直接从基类也继承过来;如果派生类覆盖了其中的某个虚函数,那么虚函数表的指针就会被替换。在运行时,动态绑定的调用过程是这样的,首先,基类指针被赋值为派生类对象的地址,那么就可以找到指向这个类的虚函数的隐含指针,然后通过该虚函数的名字就可以在这个虚函数表中找到对应的虚函数的地址。然后进行调用就可以了。

纯虚函数

您可能想要在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是您在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。 virtual int area() = 0;

虚函数与纯虚函数的区别

虚函数主要强调继承,继承了基类的接口,而且必须实现纯虚函数则强调接口的统一和规范性,在父类中可以只声明不实现;而实现了纯虚函数的子类,该纯虚函数子类中就变成了虚函数,子类的子类可以覆盖

虚函数和纯虚函数可以定义在同一个类中,含有纯虚函数的类被称为抽象类抽象类不能直接实例化,否则会出现抽象类不能实例化对象的错误,只有被继承并且重写后才能使用

虚函数纯虚函数的定义中不能有static标识符,因为被static修饰的函数在编译的时候要求前期静态绑定,然而虚函数纯虚函数都是动态绑定

参考

www.runoob.com/cplusplus/c…

blog.csdn.net/qq_38410730…