一 建構函數中能呼叫虛擬函數,實現多態性嗎
1)物件中的VPTR指標何時被初始化?
物件在建立的時,由編譯器對VPTR指標進行初始化
只有當物件的建構完全結束後VPTR的指向才最終確定
父類別物件的VPTR指向父類虛函數表
子類別物件的VPTR指向子類虛擬函數表
class Parent { public: Parent(int a=0)//执行时此时的调用的print函数仍然是父类的函数(此时会将vptr指针指向父类的虚函数表) { this->a = a; print(); } virtual void print() { cout<<"我是爹"<<endl; } private: int a; }; class Child : public Parent { public: Child(int a = 0, int b=0):Parent(a)//先执行父类构造器,执行完之后返回子类(vprt指针指回子类虚函数表) { this->b = b; print(); } virtual void print() { cout<<"我是儿子"<<endl; } private: int b; }; void HowToPlay(Parent *base) { base->print(); //有多态发生 //2 动手脚 } void main() { Child c1; //定义一个子类对象 ,在这个过程中,在父类构造函数中调用虚函数print 能发生多态吗? system("pause"); return ; }
二父類指針步長和子類指針步長不一致時
class Parent { public: Parent(int a=0) { this->a = a; } virtual void print() { cout<<"我是爹"<<endl; } private: int a; }; //成功 ,一次偶然的成功 ,必然的失败更可怕 class Child : public Parent { public: /* Child(int a = 0, int b=0):Parent(a) { this->b = b; print(); } */ Child(int b = 0):Parent(0) { //this->b = b; } virtual void print() { cout<<"我是儿子"<<endl; } private: //int b; }; void HowToPlay(Parent *base) { base->print(); //有多态发生 //2 动手脚 } void main() { Child c1; //定义一个子类对象 ,在这个过程中,在父类构造函数中调用虚函数print 能发生多态吗? //c1.print(); Parent *pP = NULL; Child *pC = NULL; Child array[] = {Child(1), Child(2), Child(3)}; pP = array; pC = array; pP->print(); pC->print(); //多态发生 pP++; pC++; pP->print(); pC->print(); //多态发生 pP++; pC++; pP->print(); pC->print(); //多态发生 cout<<"hello..."<<endl; system("pause"); return ; }