博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++虚函数定义
阅读量:4297 次
发布时间:2019-05-27

本文共 2073 字,大约阅读时间需要 6 分钟。

多态是指使用相同的函数名来访问函数不同的实现方法,即“一种接口,多种方法”,用相同的形式访问一组通用的运算,每个运算可能对应的行为不同。


C++支持编译时多态和运行时多态,运算符重载和函数重载就是编译时多态,而派生类和虚函数实现运行时多态。


运行时多态的基础是基类指针,基类指针可以指向任何派生类对象。


虚函数与基类指针在一起时会有奇妙的现象...

1.虚函数是为了实现多态而存在的

请看以下程序:

#include 


using namespace std;


class F

{

    public:

    void novir()

        {


            cout << "father novir" <<endl;


        }


        virtual void vir()

        {


            cout<< "father vir"<<endl;


        }

};


 class S : public F

{

    public:

    void novir()

        {


            cout << "son novir"<<endl;


        }


        void vir()

        {


            cout << "son vir"<<endl;


        }

};


int main()

{

        F f;


        S s;



        s.novir();// 子类起作用,输出为 son novir


        s.vir();//子类起作用,输出为son vir



        f.novir();//父类起作用(因为其本身在这里与子类没有关系),输出father novir


        f.vir();// 父类起作用(因为其本身在这里与子类没有关系),输出father vir



        F *ff;

        ff = &s;//将一个父类指针指向一个子类对象;子类指针不能指向父类对象


        ff->novir();//父类起作用,显示father novir


        ff->vir();//子类起作用,虚函数多态的用处,显示 son vir,具体参见下面解释




        return 0;

}


输出:

[root@localhost root]# ./vir

son novir

son vir

father novir

father vir

father novir

son vir




例如:父类为 车,子类为汽车 


子类指针不能指向父类对象(即将父类对象赋值给子类指针):

因为子类中有些信息父类没有,如果用指针访问的时候很可能访问到父类没有的一些属性及函数,会出错。父类的对象可以有很多,自行车,摩托车,轿车等,如果用一个父类的对象赋给子类汽车的指针,汽车有的属性,例如发动机,父类对象就没有,会产生错误。


父类指针可以指向子类对象(即将子类对象赋值给父类指针):


由于继承的关系,子类对象同样也是父类的对象,例如:汽车有轮子,汽车也属于车,父类车也有轮子,这种情况下,子类对象就成为了父类的一个对象,所以只能操作父类有的属性及函数。对于那些父类没有的属性,必须将父类指针强制转化为子类指针后才可使用。



虚函数的多态体现


我们都知道,程序运行的过程要经过 预处理,编译,运行,链接等步骤。虚函数在程序运行的时候才被绑定,编译的时候不进行相关处理,只有运行的时候才对其进行相关操作。 

所以在程序片:

================================================================================

    F *ff;

        ff = &s;//将一个父类指针指向一个子类对象;子类指针不能指向父类对象


        ff->novir();//父类起作用,显示father novir


        ff->vir();//子类起作用,虚函数多态的用处,显示 son vir

================================================================================



程序在运行时决定调用虚函数的哪个定义,这个决定依赖于基类型指针所指向的对象的类型。通过点运算调用虚函数时,忽略了虚函数的多态性,**只有**使用***基类型指针访问虚函数***,运行时的多态性才得以体现。即C++根据指针指向对象的类型来决定调用虚函数的哪个定义,在这里,指针所指向的类型为子类对象,所以虚函数使用子类的函数。





2.虚函数与重载函数的区别:


    1)重载函数之间必须在参数的类型或者数量上加以区分,而重新定义的虚函数在参数的类型和数量上必须与原型相同;


    2)在定义虚函数的类中,虚函数必须声明为类的成员而不能是友元,可以被声明为其他类的友元;析构函数可以是虚函数,构造函数不行。


(3)纯虚函数及其作用:


    纯虚函数是指在基类中声明但是没有定义的虚函数:virtual type func(param list) = 0;


    把虚函数声明为纯虚函数可以强制在派生类中重新定义虚函数,否则编译器会报错。


(4)抽象类及其特征


    如果一个类至少有一个纯虚函数,则称为抽象类。抽象类只能用来作为其他类的基类,不能定义抽象类的对象,因为在抽象类中有一个或者多个函数没有定义。但是能够使用抽象类来声明指针或者引用。

转载地址:http://gqcws.baihongyu.com/

你可能感兴趣的文章
VNPY2.0火币期货交易接口配置使用
查看>>
win10和ubuntu18双系统时间同步(20190604亲测可行)
查看>>
重启小狼毫输入法,rime输入法重启
查看>>
命令行或终端ImportError:No module named(pycharm运行没问题)
查看>>
量化策略回测01双均线
查看>>
量化策略回测ATRRSI
查看>>
量化干货:量化交易系统设计的六大细节
查看>>
量化策略回测tdma
查看>>
量化策略回测TRIXKDJ
查看>>
量化策略回测唐安奇通道
查看>>
CTA策略如何过滤部分震荡行情?
查看>>
量化策略回测DualThrust
查看>>
量化策略回测BoolC
查看>>
量化策略回测DCCV2
查看>>
mongodb查询优化
查看>>
五步git操作搞定Github中fork的项目与原作者同步
查看>>
git 删除远程分支
查看>>
删远端分支报错remote refs do not exist或git: refusing to delete the current branch解决方法
查看>>
python multiprocessing遇到Can’t pickle instancemethod问题
查看>>
APP真机测试及发布
查看>>