虚函数
虚继承了一个函数类型的映射元素,按照虚继承的说法,应该是间接获得此函数的地址,但结果却是间接获得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










