virtual多态 你不知道的事情
<1>如果父子類虛函數(shù)都有默認(rèn)參數(shù),這種情況下根據(jù)指針類型來調(diào)用對(duì)應(yīng)函數(shù)
<2>構(gòu)造過程中,虛表還沒有建立,此時(shí)在構(gòu)造或析構(gòu)函數(shù)中調(diào)用虛函數(shù)為靜態(tài)調(diào)用
<3>const類型函數(shù)和非const類型函數(shù)不構(gòu)成覆蓋(多態(tài))
<4>返回類型不同不構(gòu)成覆蓋(多態(tài)),但可以為子類對(duì)象的指針或引用
通過虛表調(diào)用函數(shù):
typedef void (*PFUNC)(void);
typedef PFUNC* PVTAB;
class A {
public:
virtual void foo (void) {
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;
}
結(jié)果:
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
轉(zhuǎn)載于:https://blog.51cto.com/bagger/1335531
總結(jié)
以上是生活随笔為你收集整理的virtual多态 你不知道的事情的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用html写个人简历
- 下一篇: 第三章 虚拟化概述(处理器虚拟化)