虚函数

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;
}

你可能感兴趣的:(c,Class,reference)