博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
虚函数和重载
阅读量:6346 次
发布时间:2019-06-22

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

面试必考。。。。。

1 #include 
2 class CBase 3 { 4 public: 5 virtual void f(int x) 6 { 7 printf("CBase::f 函数打印:整数%d\n",x); 8 } 9 10 void g(float x)11 {12 printf("CBase::g 函数打印:浮点小数%f\n",x);13 }14 };15 16 // 继承类 CDerived17 class CDerived:public CBase18 {19 public:20 void f(int x)21 {22 printf("CDerived::f 函数打印:整数%d\n",x);23 }24 public:25 26 void g(float x)27 {28 printf("CDerived:g 函数打印:浮点小数%f\n",x);29 }30 };31 32 33 void main()34 {35 36 CDerived DerivedObj;37 DerivedObj.f(3);38 DerivedObj.g(6.0f);39 40 CBase* pBaseObj = &DerivedObj;41 pBaseObj->f(3); // 此处是指针访问42 pBaseObj->g(6.0f);43 }

 

输出结果为:	CDerived::f 函数打印:整数3	CDerived:g 函数打印:浮点小数6.000000	CDerived::f 函数打印:整数3	CBase::g 函数打印:浮点小数6.000000

 

  如果将继承类对象转换为基类对象去调用 f 和 g ,就不一定调用继承类本身的函数。因为基类CBase 的函数 f 为 virtual 虚函数,而继承类 CDerived 又重载了该函数,于是基类的函数 f 【被覆盖】掉,从而 CBase 类的函数实际是 CDerived::f 和 CBase::g。所以,利用转换为基类的对象 *pBaseObj 调用 f函数,仍然是继承类本身定义的函数;但调用 g 函数,则是基类的 g 函数,而不是继承类本身的函数g。这种调用是需要提防的,可能产生混乱。

    
    由此可见,如果一个类的函数希望做的灵活一些,允许继承类的重载函数修改它,最好将它声明为 virtual 虚函数。一个函数一经声明为 virtual 函数,它在继承类中的重载函数,也是虚函数,不必再用virtual 进行修饰。
    此外,如果在虚函数的声明之后加上 "=0" 的标记,函数就成为纯虚函数。一个类包含纯虚函数的定义,该类称为抽象类。抽象类不能创建对象,作为继承类的【接口】规范,要求继承类必须提供一个纯虚函数的具体实现,否则产生编译错误。

    如下是纯虚函数的一般定义:

    virtual  函数返回值类型  函数名(  参数列表 ) =0;
一句话总结:虚函数是为了实现【多态】; 纯虚函数是为了实现【接口】;

暂时只讨论这么多,后续还会再补充........

转载于:https://www.cnblogs.com/music-liang/articles/3039283.html

你可能感兴趣的文章
List集合add使用过程中出现的错误
查看>>
可能是最简单的面向对象入门教程(一 ) 一个鸭子引发的血案
查看>>
有关Lambda的一些思考
查看>>
配置文件 /etc/profile出错导致ls,vi不能用
查看>>
直接插入排序 快速排序算法 直接选择排序
查看>>
回归算法比较(线性回归,Ridge回归,Lasso回归)
查看>>
NetBeans使用技巧
查看>>
如何学习复杂的知识,比如《算法导论》
查看>>
爬虫大作业
查看>>
大数据论述
查看>>
简单animate方法的封装
查看>>
JSON.parse()和JSON.stringify()
查看>>
常见网站
查看>>
JS框架avalon简单例子 行编辑 添加 修改 删除 验证
查看>>
linux 安装 bitnamid-redmine
查看>>
方法内部类
查看>>
不过的小东东
查看>>
随时更新
查看>>
python操作mongodb之七时间和时区
查看>>
MVVM开始
查看>>