1.子类和父类,若父类中某个非虚函数和子类重合(即函数名字和函数形参相同),则若用基类指针指向派生类指针,调用该函数返回基类的结果,若是虚函数,则返回派生类的结果,引用类型的结果类似.

若基类中某个函数为虚函数,则由该基类派生出的所有派生类(包括派生类的派生类类型)的该函数都是虚函数.

 

2.在包含有虚函数的基类中,每个类有一个虚函数表,类的第一个变量是一个虚表指针,指针指向这个虚函数表,每个类的虚函数表不一样

class A{
    int i;
public:
    A():i(10) {};

    virtual void h() {cout << "A:h()" << endl;}

    virtual void g() {cout << "A:g()" << endl;}

    void f() {cout << "A:f()" << endl;}
};

class B:public A
{
public:
    void g() {cout<<"B:g()"<<endl;}
};

    int *p = (int *)&a1;//p指向对象a1,p变量存储对象a1的地址,*p代表对象a1地址块中的第一个值,即虚表指针变量的值(指针变量存储所指向对象的地址,*p代表所指对象的值)
    int *q = (int *)&a2;
    cout<<*p<<" "<<*q<<endl;   //输出20306948 20306948,说明同一个类的不同对象的虚表指针指向同一块内存.

    p = (int *)&a1;
    q = (int *)&b;
    cout<<*p<<" "<<*q<<endl;  //输出20306948 20307044,不同类的对象虚表指针指向的内存位置不同

    int *x = (int *) *p;  //p指向对象a1,*p代表虚表指针变量存储的值,x
    int *y = (int *) *q;
    cout<<*x<<" "<<*y<<endl;  //输出20256010 20256010,基类有两个虚函数h()和g(),h()在派生类中未被重新定义,因此基类和派生类的h()函数指针相同
    x++;y++;
    cout<<*x<<" "<<*y<<endl; //输出20255305 20256000,虚函数g()在派生类中被重新定义,因此基类和派生类的g()函数指针不同.

 

posted on 2014-01-09 10:34  lss1990  阅读(144)  评论(0编辑  收藏  举报