http://www.vckbase.com/document/viewdoc/?id=950
1. 虚函数的内存结构
当一个类中有了虚函数,该类的内存结构中有存有了一个vptr,这个指针指向了本类虚函数指针数组的首地址。
所以,在下面的例子中,sizeof(A)是4,也就是一个指针的大小。哪怕有多个虚函数,大小也是4。
此外当子类继承了多个带有虚函数的父类时,子类的内存结构中就有多个vptr,分别指向了各自父类的vptr。
所以,下面例子中的sizeof(d)就是12,因为有三个父类。
同样在下面的例子中,三个父类都有虚函数f(),那么在子类中就必须使用A::f(),或者B::f()来显示调用父类中的函数。
如果在子类,Drive,中也定义了f()那就可以直接调用,且调用的是Drive::f()。
#include <iostream>
using namespace std;
class A {
public:
virtual void f() { cout << "virtual of A" << endl; }
virtual void f1() { }
};
class B {
public:
virtual void f() { cout << "virtual of B" << endl;}
};
class C {
public:
virtual void f() { cout << "virtual of C" << endl;}
};
class Drive : public A, public B, public C {
};
int main() {
Drive d;
cout << "Size is = " << sizeof(A) << endl;
cout << "Size is = " << sizeof(d) << endl;
d.A::f();
return 0;
}
2.虚函数的多态
多态在C++中是必须通过 指针 或者 引用 来实现的。
#include <iostream>
using namespace std;
class A{
public:
virtual void f(){cout << "A::f" << endl;};
};
class B:public A{
public:
virtual void f(){cout << "B::f" << endl;};
};
class C:public A{
public:
virtual void f(){cout << "C::f" << endl;};
};
void test(A *a){
a->f();
};
int main(int argc, char* argv[])
{
B *b=new B;
C *c=new C;
// reference
B rb;
A& a = rb;
a.f();
// pointer
char choice;
do{
cout<<"type B for class B,C for class C:"<<endl;
cin>>choice;
if(choice=='B')
test(b);
else if(choice=='C')
test(c);
}while(1);
cout<<endl<<endl;
return 0;
}