ホームページ >バックエンド開発 >C#.Net チュートリアル >C++ レビューの要点まとめ 11 - ポリモーフィズム (2)
1. ポリモーフィズムを実現するために仮想関数をコンストラクター内で呼び出すことができますか?
1) オブジェクト内の VPTR ポインターはいつ初期化されますか?
オブジェクトが作成されると、VPTRポインタはコンパイラによって初期化されます
VPTRのポイントは、オブジェクトの構築が完全に完了した後にのみ確定されます
親クラスオブジェクトのVPTRは、親クラスの仮想関数を指しますtable
子クラスのオブジェクト 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 ; }
2番目の親クラスポインタのステップサイズとサブクラスポインタのステップサイズが一致しない場合
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 ; }
上記は、C++ レビューのポイント 11 - ポリモーフィズム (2) の内容をまとめたものです。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。