zoukankan      html  css  js  c++  java
  • 调用哪个虚函数的问题

     1:  #include<iostream>
     2:  #include<string>
     3:  using namespace std;
     4:   
     5:  class A {
     6:  public:
     7:      void virtual f()
     8:      {
     9:          cout << "A" << endl;
    10:      }
    11:  };
    12:   
    13:  class B : public A{
    14:  public:
    15:      void virtual f(){
    16:          cout << "B" << endl;
    17:      }
    18:  };
    19:   
    20:  int main()
    21:  {
    22:      A *pa = new A();
    23:      pa->f();
    24:      B *pb = (B*)pa;
    25:      pb->f();
    26:      delete pa,pb;
    27:      pa = new B();
    28:      pa->f();
    29:      pb = (B*)pa;
    30:      pb->f();
    31:   
    32:      getchar();
    33:      return 0;
    34:  }

    运行结果:

    捕获

    分析:

    1)虚函数是占用空间的,含有1个虚函数的类的对象,其内部有一个虚函数指针,所以其sizeof大小为各个成员变量大小之和,在加上虚函数指针的大小(一般为4B,32位机器)。

    2)当通过基类指针或子类指针调用虚函数的时候,都是通过该指针当前指向的对象中的虚函数指针来调用合适的虚函数。所以,无论该指针为基类类型、子类类型,调用哪个虚函数都取决于其所指向的对象的类型(实际依赖对象中的虚函数指针)。

    3)通过类对象调用虚函数,理所当然调用的是该对象类类型的虚函数。

    #include<iostream>
    #include<string>
    using namespace std;
    
    class A {
    public:
        int val;
        A(int i=1): val(i){};
        int virtual f()
        {
            return val;
        }
    };
    
    class B : public A{
    public:
        int val;
        B(int i=2): val(i){};
    };
    
    int main()
    {
        B b;
        cout << b.f() << endl;
        getchar();
        return 0;
    }

    输出:

         结果为1。

  • 相关阅读:
    产品经理职责
    Python基础知识之:字符串拼接
    Python基础知识之:hello world,注释,变量,数据类型
    Python初接触
    系统测试基础大纲
    编程零基础应当如何开始学习 Python?
    可以用 Python 编程语言做哪些神奇好玩的事情?
    江湖二三事:听说你想做数据分析师?
    “羊车门”问题
    用Turtle画正螺旋线
  • 原文地址:https://www.cnblogs.com/younes/p/1796030.html
Copyright © 2011-2022 走看看