c++ 对象模型21

单继承下的虚函数

class Base{
public:
    virtual void f(){cout << "Base::f()" <     virtual void g(){cout << "Base::g()" <     virtual void h(){cout << "Base::h()" <

}

class Derive :public Base{
public:
    virtual void g(){cout << "Derive::g()" <     void myselffunc(){}    //  只属于Derive的函数
}


//  类结构  :  父类和子类各自一个虚指针  然后各自指向一个虚函数表  虚函数表中存放f() g() h() 方法入口地址
//  子类的虚函数表指向覆写的g() 其余的不变


-------------------------------------------------------

    
class Base{
public:
    virtual void f(){cout << "Base::f()" <     virtual void g(){cout << "Base::g()" <     virtual void h(){cout << "Base::h()" <

}

class Derive :public Base{
public:
    virtual void i(){cout << "Derive::i()" <     virtual void g(){cout << "Derive::g()" <     void myselffunc(){}    //  只属于Derive的函数
}

int main(){
    Derive myderive;
    Derive *pointderive = &myderive;
    pointderive->f();   // edx
    pointderive->g();   //  edx +4
    pointderive->h();   //  edx  +8
    pointderive->i();    //  edx +12
    // 反汇编代码中i还是排列在f()  g()  h() 函数以后
}
//  Derive  函数地址排列顺序
f()
g()   //  其中g是子类覆写以后的函数
h()
i()


-------------------------------------------------------

    
class Base{
public:
    virtual void f(){cout << "Base::f()" <     virtual void g(){cout << "Base::g()" <     virtual void h(){cout << "Base::h()" <

}

class Derive :public Base{
public:
    virtual void i(){cout << "Derive::i()" <     virtual void g(){cout << "Derive::g()" <     void myselffunc(){}    //  只属于Derive的函数
}

int main(){
    Base *b = new Derive();  // 基类指针指向派生类对象
    b->g();
    // 编译器视角:
    // (*pb->vptr[1])(pb)  // g在第二个  this指针 =  pb   // 编译期间就能确定
    // 我们唯一需要在执行期间知道的是通过哪个虚函数表掉用的虚函数
    //  虚函数地址 编译期间 写在可执行文件中 编译期间已经构建出来
    
    
    Derive myderive;
    Base &interBase = myderive;    // 基类引用 一个子类对象


}


-------------------------------------------------------

    
class Base{
public:
    virtual void f(){cout << "Base::f()" <     virtual void g(){cout << "Base::g()" <     virtual void h(){cout << "Base::h()" <

}

class Derive :public Base{
public:

}

int main(){
    Derive a1;
    Derive a2;
    Derive *pointa3 = new Derive();
}

//  即使子类中没有覆写任何虚函数 也单独有一张属于自己的虚函数表


-------------------------------------------------------

    
class Base{
public:
    virtual void myfunc() = 0 ;  // 纯虚函数

}

class Derive :public Base{
public:

}

int main(){

    cout << sizeof(Base) < }

你可能感兴趣的:(c++)