虚函数与纯虚函数

Posted bitcarmanlee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚函数与纯虚函数相关的知识,希望对你有一定的参考价值。

1.虚函数

虚函数是 C++ 实现动态单分派子类型多态(dynamic single-dispatch subtype polymorphism)的实现方式。

方法前面加上virtual关键字,即为虚函数。

看下面的例子:

#include<iostream>
using namespace std;

class A 
    public:
        virtual void func() 
            cout<<"A::func() is running!"<<endl;
        
;

class B: public A 
    public:
        void func() 
            cout<<"B::func() is called"<<endl;
        
;


int main(int argc, char const *argv[])

    A *p = new B();
    p->func();
    return 0;

运行代码得到的结果为:

B::func() is called

如果我们将A中func函数的virtual关键字去掉,运行得到的结果为

A::func() is called

需要注意的是:
1.虚函数并不代表函数没有被实现,只有定义一个函数为纯虚函数时,才代表函数没被实现。
2.定义一个虚函数的目的,是为了使用基类的指针来调用子类的函数。

2.纯虚函数

纯虚函数是基类中声明的虚函数。与虚函数的不同在于,他在基类中没有定义,但要求任何派生类都要定义自己的实现方法。实现方式为在基类中函数原型后加“=0”

#include<iostream>
using namespace std;

class A 
    public:
        virtual void func()=0;
;

class B: public A 
;


int main(int argc, char const *argv[])

    A *p = new B();
    p->func();
    return 0;

上面的代码,在IDE中,会提示我们

allocating an object of abstract class type 'B'
不允许使用抽象类类型 "B" 的对象:C/C++(322)
virtual_code.cc(15, 16): 纯虚拟 函数 "A::func" 没有强制替代项

在B类中实现func方法

class B: public A 
    public:
        void func() 
            cout<<"this is func running!"<<endl;
        
;

此时再运行就能得到输出

this is func running!

3.使用场景

1.对于虚函数来说,其主要作用是使用基类的指针,在指向派生类的时候,还能正确调用派生类里面的不同实现方法,最终达到实现多态的目的。

2.对于纯虚函数,本质就是相当于java中的接口interface,用来规范基类中的各个功能,派生类里面一定要实现这些功能。

以上是关于虚函数与纯虚函数的主要内容,如果未能解决你的问题,请参考以下文章

C ++:私有虚函数与纯虚函数[重复]

多态实现--虚函数与纯虚函数

虚函数与纯虚函数

关于虚函数与纯虚函数的区别

虚析构函数与纯虚函数

运算符重载如何声明为纯虚函数?