virtual多态 你不知道的事情

<1>若是父子类虚函数都有默认参数,这种状况下根据指针类型来调用对应函数ide

<2>构造过程当中,虚表尚未创建,此时在构造或析构函数中调用虚函数为静态调用函数

<3>const类型函数和非const类型函数不构成覆盖(多态)spa

<4>返回类型不一样不构成覆盖(多态),但能够为子类对象的指针或引用指针

经过虚表调用函数:对象

typedef void (*PFUNC)(void);it

typedef PFUNC* PVTAB;class

class A {引用

public:gc

virtual void foo (void) {im

cout << "A::foo() invoked" << endl;

}

virtual void bar (void) {

cout << "A::bar() invoked" << endl;

}

};

class B : public A {

public:

void foo (void) {

cout << "B::foo() invoked" << endl;

}

};

int main (int argc, char* argv[]) {

A a;

PVTAB pVtab = *(PVTAB*)&a;

cout << "A::VTAB[0] = " << (void*)pVtab[0] << endl;

(pVtab[0]) ();

cout << "A::VTAB[1] = " << (void*)pVtab[1] << endl;

(pVtab[1]) ();

B b;

pVtab = *(PVTAB*)&b;

cout << "B::VTAB[0] = " << (void*)pVtab[0] << endl;

(pVtab[0]) ();

cout << "B::VTAB[1] = " << (void*)pVtab[1] << endl;

(pVtab[1]) ();

return 0;

}

结果:

A::VTAB[0] = 00401087

A::foo() invoked

A::VTAB[1] = 00401267

A::bar() invoked

B::VTAB[0] = 00401082

B::foo() invoked

B::VTAB[1] = 00401267

A::bar() invoked

相关文章
相关标签/搜索