C++構造函數中不能調用虛函數


在構造函數中調用虛函數,並不會產生多態的效果,就跟普通函數一樣。

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++,構造函數,虛函數,多態,重載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM