`
beckshanling
  • 浏览: 255607 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

虚函数覆盖

    博客分类:
  • C++
阅读更多

1。覆盖函数,即在子类中用相同的函数名和签名重写父类的方法,虚函数,在子类中用相同的函数名和签名重写父类的方法(前面有virtual关键字)。如下  
        class   Father  
        {  
        public:  
                void   FunctionA()   const    
                {    
                        cout   <<   "This   is   FunctionA   of   class   Father."   <<   endl;  
                }    
                virtual   void   FunctionB()   const  
                {  
                        cout   <<   "This   is   FunctionB   of   class   Father."   <<   endl;  
                }  
        };  
   
        class   Child   :   public   Father  
        {  
        public:  
                void   FunctionA()   const    
                {  
                        cout   <<   "This   is   FunctionA   of   class   Child."   <<   endl;    
                }  
                virtual   void   FunctionB()   const  
                {  
                        cout   <<   "This   is   FunctionB   of   class   Child."   <<   endl;  
                }  
        };  

2。在将父类对象的指针指向子类对象的时候   Father*   father   =   new   Child;  
              如father->FunctionA(),则执行的是Father中的实现;father->FunctionB(),  
              则执行的是Child中的实现。  
 3。如果直接声明子类对象,Child   child;则无论child.FunctionA()还是           child.FunctionB(),执行的都是Child中的实现。  
   
  总结:调用函数的时候,关键看对象的类型 。  
  记住是对象的类型,不管是指针还是引用(同样是对象的类型)。  
  好了有了对象的类型就好办了。当你用这个对象(或者是指针、引用)去调用函数时,  
      1:该对象(实体)即不是指针或引用的形式,可以轻松的调用函数。  
      2:但是当我们用引用或指针形式时,有个问题是区别指针(引用)的类型和指针(引用)所指实体对象的类型。

 
        A:你用指针来调用某函数,若函数是非虚函数,非虚函数是静态编译的(即编译时刻确定的)。也就是说他不会去虚函数表找这个函数(因为不是虚函数),因 此调用的是指针类型的那个类的相关函数。即使派生类有这个函数(这是实际编程时的大忌!!!)。这就是  你的void   FunctionA()   const   ;  
        B:   当你用这个指针去调用一个虚函数时,他就到虚函数表中,找这个名字的函数,从指针所指对象的类型(即派生类)依次向父类走,直到遇到第一个与次匹配的函数名。    

分享到:
评论

相关推荐

    虚函数与函数重载实验

    熟悉并掌握继承与派生、虚函数(函数覆盖)、函数重载技术的使用 通过实例了解函数覆盖和函数重载之间的区别 实验前先复习“类与对象”、“派生与继承”、“多态性”部分的内容。 完成以下实验内容。在Visual ...

    虚函数表工作原理

    在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了 这个实例的内存中,所以,当我们用父类的指针来操作一个...

    函数覆盖,虚函数,纯虚函数对比

    函数覆盖,虚函数,纯虚函数对比。c++ 源代码

    C++ 虚函数表解析

    一篇关于C++ 虚函数表解析详解的文章,大家一块学习。 博主还有好多值得阅读的文章,网址http://blog.csdn.net/haoel

    (转)多重继承下的虚函数表

    在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个...

    深入剖析C++虚函数表

    在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了 这个实例的内存中,所以,当我们用父类的指针来操作一个...

    虚函数c++语言

    虚函数:在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名...

    C++虚函数与多态性

    C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写。而重载则是允许有多个同名的函数,而这些函数的参数列表不同,允许参数个数不同,...

    C++ 虚函数专题

    虚函数 基类中使用virtual关键字声明的函数,称为虚函数。 虚函数的实现,通过虚函数表来实现的。即V-table 这个表中有一个类,用于储存虚函数的地址。解决其继承,覆盖的问题,用于保证其真实反映的函数。这样有虚...

    C++实验 多态性与虚函数

    C++语言编写面向对象程序,实现柱体体积和表面积的计算...3.从抽象类 Plane 派生出具体类(如长方形类 Rectangle、圆形类 Circle 和三角形类triangle),根据实际情况,覆盖基类 Plane 的纯虚函数 area 和 girth。

    浅析C++中的虚函数

    用途:实现多态性,通过指向派生类的基类指针,访问派生类中同名覆盖成员函数 虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public。 定义为virtual的函数是基类期待派生类重新定义的,基类希望...

    网络渗透--《C++中溢出覆盖虚函数指针技术》

    网络渗透--《C++中溢出覆盖虚函数指针技术》,内部安全资料,在此与大家分享,欢迎下载...........

    C++ 类中有虚函数(虚函数表)时 内存分布详解

    在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类...

    虚函数与纯虚函数(C++与Java虚函数的区别)的深入分析

    虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型(也...

    C++中的多态与虚函数的内部实现方法

    1、什么是多态 多态性可以简单概括为“一个接口,多种行为”。 也就是说,向不同的对象发送同一个消息, 不同的对象在接收时会产生...override指基类的某个成员函数为虚函数,派生类又定义一成员函数,除函数体的其余

    C++ 基础教程之虚函数实例代码详解

    虚函数的作用:在于用专业术语来解释就是实现多态性,多态性是将接口与实现进行分离,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数;用形象的语言来解释就是实现以共同的方法,但因个体差异,而...

    C# 函数覆盖总结学习(推荐)

    覆盖类成员:通过new关键字修饰虚函数表示覆盖该虚函数。 一个虚函数被覆盖后,任何父类变量都不能访问该虚函数的具体实现。 public virtual void IntroduceMyself(){…}//父类虚函数 public new void ...

    C++子类父类成员函数的覆盖和隐藏实例详解

    (1) 基类必须是虚函数(使用virtual 关键字来进行声明) (2)发生覆盖的两个函数分别位于派生类和基类 (3)函数名和参数列表必须完全相同 函数的隐藏  隐藏发生的条件: (1)子类和父类的函数名相同,参数...

    3.单继承下不含覆盖函数的类对象的布局1

    单继承下不含覆盖函数的类对象的布局Windows平台下cl编译器:Linux平台下gcc编译器:Mac平台下clang编译器:子类对象布局虚函数表布局注意虚函数

    4.单继承下含覆盖函数的类对象的布局1

    单继承下含覆盖函数的类对象的布局Windows平台下cl编译器:Linux平台下gcc编译器:Mac平台下clang编译器:子类对象布局虚函数表布局注意虚函数表

Global site tag (gtag.js) - Google Analytics