c++多态:虚函数(为什么使用虚函数、那些函数能成为虚函数)(一)

1、什么是虚函数?来看看虚函数的官方定义:

在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,简单来说,就是被virtual关键字修饰的成员函数。

作用:实现多态性(动多态),动多态又称动态绑定或晚绑定。

 2.那为什么要使用虚函数呢?

结论:实现因对象的不同而调用其相应的函数

可以让成员函数操作一般化,用基类的指针指向不同的派生类的对象时, 基类指针调用其虚成员函数,则会调用其真正指向对象的成员函数, 而不是基类中定义的成员函数(只要派生类改写了该成员函数)。若不是虚函数,则不管基类指针指向的哪个派生类对象,调用时都 会调用基类中定义的那个函数。

文字理解起来不太形象,来代码演示一下;


#include<iostream>
using namespace std;
class Father
{
    public:
        void print()
        {
            cout<<"This is Father"<<endl;
        }
};
 
class Son : public Father
{
    public:
        void print()
        {
            cout<<"This is Son"<<endl;
        }
};
 
int main()
{
    Father a;
    Son b;
    Father *p1 = &a;
   Father *p2 = &b;
    p1->print();
    p2->print();
    return 0;
}

运行结果为:父类Show函数、父类show函数

用父类指针指向子类对象,如果不将Show函数声明为虚函数,最终调用的是父类Show函数,而不是我们派生后重写的Show函数。如果将Show函数声明为虚函数,

class Father
{
    public:
        virtual void print(){cout<<"This is Father"<<endl;}
};
class Son : public Father
{
    public:
    void print(){cout<<"This is Father"<<endl;}
};

int main()
{

    Father a;
    Son b;
    Father *p1 = &a;
    Father *p2 = &b;
    p1->print();
    p2->print();
    return 0;
}

毫无疑问,class Father的成员函数print()已经成了虚函数,那么class Son的print()成了虚函数了吗?回答是Yes,我们只需在把基类的成员函数设为virtual,其派生类的相应的函数也会自动变为虚函数。所以,class Son的print()也成了虚函数。那么对于在派生类的相应函数前是否需要用virtual关键字修饰,那就是你自己的问题了(语法上可加可不加,不加的话编译器会自动加上,但为了阅读方便和规范性,建议加上)。

现在重新运行main的代码,这样输出的结果就是This is Father和This is Son了。

3.虚函数的应用

进一步思考,为什么要用父类指针指向子类对象呢?这根本不需要声明为虚函数啊,直接定义一个子类对象,或是用子类指针指向子类对象,再来调用print函数,即使不用声明为虚函数,也能调用我们派生后重写的print函数。

虽然这样说,但是实际开发过程中不是这样的,当我们使用一些类库、框架的时候,这些类库、框架是事先就写好的。我们在使用的时候不能直接修改类库的源码,我们只能派生类库中的类来覆盖一些成员函数以实现我们的功能,但这些成员函数有的是由框架调用的。这种情况下,用虚函数是很好的办法。

4.那些函数可以成为虚函数?

成为虚函数的条件:1.能取地址  2.依赖对象调用

  1. 析构函数:可以(派生类里的析构函数最好是虚函数,否则派生类中如有空间的开辟会造成派生类内存泄漏)
  2. 普通的类成员方法:可以

以下函数不能成为虚函数:

  1. 构造函数:不能,(此时对象还没有产生)
  2. static成员方法:不能。(不依赖对象调用)
  3. inline函数:不能。(inline函数在编译时被展开,用函数体去替换函数,而虚函数是在运行期间才动态绑定。)
  4. 普通的方法:不能,(友元函数不属于类的成员函数,只能重载,不能覆盖,函数覆盖发生在继承关系中)
  5. 友元:不能(友元函数不属于类的成员函数,不能被继承)

这篇是关于虚函数的由来,下一篇更虚函数的实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值