• 【转】虚函数表


    C++的特性之一就是多态,多态的特性就是通过虚函数来实现的,而虚函数就是通过一个虚函数表来实现的。(关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。)

      

     1 #include <iostream>
     2 using namespace std;
     3 
     4 class Base1 {
     5 public:
     6     virtual void f() { cout << "Base1::f" << endl; }
     7     virtual void g() { cout << "Base1::g" << endl; }
     8     virtual void h() { cout << "Base1::h" << endl; }
     9 
    10 };
    11 
    12 class Base2 {
    13 public:
    14     virtual void f() { cout << "Base2::f" << endl; }
    15     virtual void g() { cout << "Base2::g" << endl; }
    16     virtual void h() { cout << "Base2::h" << endl; }
    17 };
    18 
    19 class Base3 {
    20 public:
    21     virtual void f() { cout << "Base3::f" << endl; }
    22     virtual void g() { cout << "Base3::g" << endl; }
    23     virtual void h() { cout << "Base3::h" << endl; }
    24 };
    25 
    26 
    27 class Derive : public Base1, public Base2, public Base3 {
    28 public:
    29     virtual void f() { cout << "Derive::f" << endl; }
    30     virtual void g1() { cout << "Derive::g1" << endl; }
    31 };
    32 
    33 
    34 typedef void(*Fun)(void);
    35 
    36 int main()
    37 {
    38     Base1 temp1;
    39     Base2 temp2;
    40     Base3 temp3;
    41 
    42     Derive d;
    43     return 0;
    44 }

    【如图:下面三面黄框,是父类的虚函数表,基类中仅继承了同名函数f(); 所以基类中f()函数覆盖了3个父类的同名函数,你看图,值都不一样,那要如何调用才能调用不同父类的f()函数,和子类本身的f()函数???

    1 Derive d;
    2 d.f();
    3 d.Base1::f();
    4 d.Base2::f();
    5 d.Base3::f();

    对象.父类名::函数名();

    参见我的博客: https://www.cnblogs.com/winslam/articles/9296594.html】

    之前已经介绍过指针函数的概念,函数名其实就是一个变量,这样,就可以比较好的理解虚函数表的实现了,子类继承的父类两个有相同的函数名,则子类就覆盖了那个函数变量,这样调用的函数就相应的改变了.

  • 相关阅读:
    洛谷P1033 自由落体 题解
    尴尬
    UVA11988 【Broken Keyboard (a.k.a. Beiju Text)】:题解
    UVA101 The Blocks Problem 题解
    TCP的粘包和拆包问题及解决办法(C#)
    MIPS学习笔记(一)
    MySQL基础(一)
    博客园的标签怎么变了两下???
    nextInt()和nextLine()连用报错
    C++代码雨
  • 原文地址:https://www.cnblogs.com/winslam/p/9551296.html
Copyright © 2020-2023  润新知