zoukankan      html  css  js  c++  java
  • C++ Virtual介绍 分类: C/C++ 2015-06-16 21:36 26人阅读 评论(0) 收藏

    参考链接:http://www.cnblogs.com/xd502djj/archive/2010/09/22/1832912.html

    学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在Base的派生类Derived中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。当基类Base的指针point指向派生类Derived的对象时,对point的print函数的调用实际上是调用了Derived的print函数而不是Base的print函数。这是面向对象中的多态性的体现。

    class Base
    {
    public:Base(){}
    public:
           virtual void print(){cout<<"Base";}
    };
    
    class Derived:public Base
    {
    public:Derived(){}
    public:
           void print(){cout<<"Derived";}
    };
    
    int main()
    {
           Base *point=new Derived();
           point->print();
    }
    
    Output:
    Derived 

    这也许会使人联想到函数的重载,但稍加对比就会发现两者是完全不同的:
    (1)

    • 重载的几个函数必须在同一个类中;
    • 覆盖的函数必须在有继承关系的不同的类中

    (2)

    • 覆盖的几个函数必须函数名、参数、返回值都相同;
    • 重载的函数必须函数名相同,参数不同。参数不同的目的就是为了在函数调用的时候编译器能够通过参数来判断程序是在调用的哪个函数。这也就很自然地解释了为什么函数不能通过返回值不同来重载,因为程序在调用函数时很有可能不关心返回值,编译器就无法从代码中看出程序在调用的是哪个函数了。

    (3)

    • 覆盖的函数前必须加关键字Virtual;
    • 重载和Virtual没有任何瓜葛,加不加都不影响重载的运作。

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    jquery ajax参数详解
    压缩解压函数实现
    WCF 大数据量如何从服务端传到客户端
    [DllImport("kernel32.dll")]
    Oracle数据库使用基础和实例
    Js常用的动态效果
    Js使用正则实现表单验证
    Oracle数据库理论知识
    HTML5,CSS3,JavaScript基础知识与使用
    速读《人月神话》
  • 原文地址:https://www.cnblogs.com/paulweihan/p/4660094.html
Copyright © 2011-2022 走看看