在構造函數中調用虛函數,並不會產生多態的效果,就跟普通函數一樣。
c++ primer 第四版中497頁15.4.5構造函數和析構中的虛函數講到,如果在構造函數或析構函數中調用虛函數,則運行的是為構造函數或析構函數自身類型定義的版本。另外,必須通過基類類型的引用或指針進行函數調用才會發生多態。
相關帖子:http://bbs.csdn.net/topics/390537893
//示例1 #include <iostream> using namespace std; class A { private: int m_a; public: A(int a): m_a(a) {show();} virtual ~A() {}; virtual void show() const {cout << "show a: " << m_a << endl;} virtual void disp() const {cout << "disp a: " << m_a << endl;} }; class B: public A { private: int m_b; public: B(int a, int b): m_b(b), A(a) {} void show() const {cout << "show b: " << m_b << endl;} void disp() const {cout << "disp b: " << m_b << endl;} }; int main() { A* pob3 = new B(100, 200); pob3->disp(); delete pob3; return 0; }
//示例1運行結果 show a: 100 disp b: 200 請按任意鍵繼續. . .
//示例2 #include <tchar.h> #include <iostream> using namespace std; class A { public: A() { cout << "A構造函數"; Test(); } ~A() { cout << "A析構函數"; cout << "A::Test()" << endl; } virtual void Test() { cout << "A::Test()" << endl; } }; class B :public A { public: B() { cout << "B構造函數"; Test(); } ~B() { cout << "B析構函數"; Test(); } virtual void Test() { cout << "B::Test()" << endl; } }; int _tmain(int argc, _TCHAR* argv[]) { A* pA = new B(); cout << "動態調用:"; pA->Test(); delete pA; return 0; }
//示例2運行結果 A構造函數A::Test() B構造函數B::Test() 動態調用:B::Test() A析構函數A::Test() 請按任意鍵繼續. . .
//http://www.cnblogs.com/vcpp123/p/5795421.html
//轉載請注明出處 //http://www.cnblogs.com/vcpp123/p/5795421.html
關鍵詞:C++,構造函數,虛函數,多態,重載