首页 > 编程知识 正文

虚函数和纯虚函数的区别,虚函数和函数重载的区别

时间:2023-05-05 22:56:39 阅读:255396 作者:1764

C++面向对象程序设计有三大思想:抽象、继承、多态

其中多态的实现建立在子类继承父类的基础上,它是由C++编译器的一个核心技术实现,即动态绑定技术。其核心思想是父类对象调用子类对象的方法。而父类对象调用子类对象的方法时,这个被调用的方法必须在父类中声明为虚函数,因此虚函数是实现多态的一个中介。而纯虚函数是将父类上升为一个抽象类,抽象类无法实例化,只有方法的声明,其实现由其子类完成。就像动物无法实例化为具体的对象,而老虎、狮子都可以继承动物的特性(即父类的接口),从而有自己的实例化对象。

以下是虚函数和纯虚函数的区别点:

1、类如果声明了虚函数,这个函数是实现了的,即使是空实现,它的作用就是为了能让这个函数在它的子类里面可以被覆盖,这样编译器就可以使用动态绑定来达到多态的目的(即父类指针指向子类对象,调用子类方法)。而纯虚函数只是在基类中的一个函数定义,即是一个函数声明而已,具体的实现需要留到子类当中。

2、虚函数在子类里面也可以不进行重写(只有虚方法和抽象方法才能够被重写);但纯虚函数必须在子类去实现。

3、虚函数的类用于“实作继承”,也就是说继承接口的同时也继承了父类的实现。当然,子类也可以进行覆写,从而完成自己关于此函数的实现。纯虚函数的类用于“介面继承”,即纯虚函数关注的是接口的统一性,实现由子类去完成。

4、带纯虚函数的类叫做抽象类,这种类不能直接生成对象,而只有被继承,并重写其虚函数后,才能使用。

代码示例:

#include <iostream>using namespace std;// 抽象类class Base {public: virtual void func() = 0;// 纯虚函数};class child1 : public Base {public:void func() { cout << "it's child 1" << endl; }// 覆写父类的纯虚函数};class child2 : public Base {public:void func() { cout << "it's child 2" << endl; }// 覆写父类的纯虚函数};int main() {// Base b; // 纯虚函数无法实例化Base* b = nullptr; // 父类指针child1 c1; // 子类对象child2 c2; // 子类对象b = &c1;b->func();// 多态b = &c2;b->func();// 多态return 0;}

代码输出:

it's child 1it's child 2

总结:

虚函数和纯虚函数都是为了多态这一特性而服务的,不同的点是纯虚函数将父类上升为一个抽象类,无法实例化对象,只有接口声明,而其子类需要去实现父类中的声明,这就统一了接口,只需要使用父类指针,指向具体的子类对象,去调用相应的虚方法即可。

谢谢阅读

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。