`
beckshanling
  • 浏览: 262807 次
  • 性别: 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:   当你用这个指针去调用一个虚函数时,他就到虚函数表中,找这个名字的函数,从指针所指对象的类型(即派生类)依次向父类走,直到遇到第一个与次匹配的函数名。    

分享到:
评论

相关推荐

    C++ 虚函数表解析

    ##### 一般继承(无虚函数覆盖) 假设存在以下继承关系: ```cpp class Derived : public Base { public: // 没有重写基类的虚函数 }; ``` 在这种情况下,`Derived` 类的对象的虚函数表与 `Base` 类的虚函数表...

    虚函数表解析

    在没有虚函数覆盖的情况下,基类和派生类的虚函数表是完全相同的。这意味着无论使用基类指针还是派生类指针调用虚函数,最终都会调用到基类中的虚函数实现。这种情况下的虚函数表结构简单,不会有任何额外的变化。 ...

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

    如果没有虚函数覆盖,每个基类的虚函数表都会独立存在,子类的虚函数表将包含所有基类的虚函数。如果有虚函数覆盖,子类会替换基类中被覆盖的虚函数,确保调用的是子类版本的函数。比如: ```cpp class Base1 { ...

    c++虚函数使用

    C++ 虚函数使用 C++ 虚函数是实现多态机制的主要手段。多态机制允许使用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这是一种泛型技术,旨在使用不变的代码来实现可变的算法。 ...

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

    在C++编程语言中,函数覆盖、虚函数和纯虚函数是面向对象编程中的关键概念,它们涉及到类的继承和多态性。本文将详细探讨这三个概念,以及它们之间的对比。 1. **函数覆盖(Function Overriding)** 函数覆盖发生...

    C++ 虚函数表详解

    在无覆盖的情况下,虚函数表中包含了父类的虚函数的地址,而在有覆盖的情况下,虚函数表中包含了子类的虚函数的地址。 虚函数表是C++中实现多态机制的关键组件,用于存储类的虚函数的地址,解决继承和覆盖的问题。 ...

    虚函数的真相(VC编译器如何实现“virtual ”规则)

    此外,C++11引入了`override`关键字,用于明确指定函数是重写基类的虚函数,这有助于避免因拼写错误或其他原因导致的意外非虚函数覆盖。 总的来说,虚函数是C++多态性的基础,而VC编译器通过虚函数表实现了这一特性...

    c++中子类对象不能调用父类中的虚函数

    然而,这里有一个陷阱:如果通过子类对象直接调用父类的虚函数,编译器会认为是在调用子类自身的实现,即使子类没有覆盖这个虚函数。这就是“子类对象不能调用父类中的虚函数”的含义。例如,假设我们有以下代码: ...

    详细讲述c++虚函数实现

    在没有覆盖父类虚函数的情况下,子类的虚函数表会包含父类的虚函数指针,而子类新增的虚函数则添加到表的后面。如果有覆盖,子类的虚函数表将替换掉相应父类的虚函数指针,确保调用到的是子类的实现。 例如,如果有...

    虚函数与函数重载实验

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

    虚函数简单示例

    总的来说,这个示例项目很可能是为了演示如何在C#中使用虚函数实现多态,通过创建一个基类和一个或多个子类,展示如何覆盖虚函数,并在实际代码中调用这些函数来显示多态的效果。对于初学者,这是一个很好的练习,...

    C++中的虚函数表图解

    如果我们有一个继承自`Base`的子类`Derived`,并且`Derived`重载了`Base`的某些虚函数,那么`Derived`类的虚函数表将包含`Base`的虚函数指针,以及覆盖后的子类虚函数指针。如果子类没有覆盖父类的某个虚函数,那么...

    虚函数的使用技巧.rar_C++虚函数_虚函数

    从C++11开始,可以使用`final`关键字阻止子类进一步覆盖虚函数: ```cpp class Base { public: virtual void func() final; }; ``` 8. **显式虚函数调用**: 使用`-&gt;*`或`.`操作符进行虚函数调用。显式...

    虚函数代码列子

    此外,还可以使用`override`关键字来明确指定派生类中的函数覆盖了基类的虚函数,这样可以避免因为命名冲突或不匹配的签名导致意外的行为。 总结来说,虚函数是C++实现多态的关键机制,它使得我们可以设计更加灵活...

    利用虚函数计算各种图形面积

    每个派生类都继承自`Shape`,并覆盖`getArea()`虚函数,实现各自特有的面积计算方法。例如,`Triangle`类会实现一个计算三角形面积的`getArea()`,`Square`类则会计算正方形面积,以此类推。 三角形的面积通常由底...

    虚函数虚表的详解,大家看看!

    如果子类重写了父类的虚函数,子类的虚表会将被覆盖的虚函数替换为子类的版本,而其他未被覆盖的虚函数仍然保留。例如,如果子类`Derive`重写了父类`Base`的`f()`函数,`Derive`的虚表中`Base`的`f()`位置会被`...

    虚函数、多态、动态联编

    在继承关系中,如果子类没有覆盖父类的虚函数,那么子类的虚函数表会包含父类的虚函数,同时添加子类特有的虚函数。如果子类覆盖了父类的虚函数,子类的虚函数表会用子类的实现替换掉父类的相应条目。这意味着,即使...

    Unity3d C# 虚函数 例子

    类 D 中,我们使用 new 关键字声明了一个新的函数 Func,但是这并不是重新实现虚函数 Func,而是覆盖父类里的同名函数。 在 Main 函数中,我们创建了四个对象 a、b、c、d,它们分别是类 A、B、C、D 的实例。在执行...

Global site tag (gtag.js) - Google Analytics