现在的位置: 首页 > 综合 > 正文

调用哪个虚函数的问题

2012年07月16日 ⁄ 综合 ⁄ 共 1456字 ⁄ 字号 评论关闭
 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。

抱歉!评论已关闭.