C++ 基础教程:C++学习从零开始(四)

2020-01-06 12:25:01王旭

虚函数

  虚继承了一个函数类型的映射元素,按照虚继承的说法,应该是间接获得此函数的地址,但结果却是间接获得this参数的值。为了间接获得函数的地址,C++又提出了一种语法--虚函数。在类型定义符“{}”中书写函数声明或定义时,在声明或定义语句前加上关键字virtual即可,如下:

  struct A { long a; virtual void ABC(), BCD(); };

  void A::ABC() { a = 10; } void A::BCD() { a = 5; }

  上面等同于下面:

  struct A { void ( A::*pF )(); long a; void ABC(), BCD(); A(); };

  void A::ABC() { a = 10; } void A::BCD() { a = 5; }

  void ( A::*AVF[] )() = { A::ABC, A::BCD }; void A::A() { pF = AVF; }

  这里A的成员A::pF和之前的虚类表一样,是一个指针,指向一个数组,这个数组被称作虚函数表(Virtual Function Table),是一个函数指针的数组。这样使用A::ABC时,将通过给出A::ABC在A::pF中的序号,由A::pF间接获得,因此A a; a.ABC();将等同于( a.*( a.pF[0] ) )();。因此结构A的长度是8字节,再看下面的代码:

  struct B : public A { long b; void ABC(); }; struct C : public A { long c; virtual void

  ABC(); };

  struct BB : public B { long bb; void ABC(); }; struct CC : public C { long cc; void