前段時間,一個同事問了一個問題,C++類中的構造函數析構函數派生的子類能否繼承?這個問題以前真的沒有注意過,按道理來講應該說可以的,但是本着求證的態度寫了一段測試代碼:
#include <map>
#include <list>
using namespace std;
class CTest
{
protected:
/*
CTest()
{
printf("construct CTest\n");
}
*/
public:
virtual ~CTest()
{
printf("Test\n");
}
};
class CTest2: public CTest
{
public:
void Add()
{
CTest::~CTest();
}
};
void main()
{
CTest2 Test;
Test.Add();
}
測試結果:
顯示調用了析構函數,析構函數被繼承了。
關於構造函數能否被繼承,還真的不是很好驗證,因爲構造函數只能夠隱式被調用。需要怎麼去驗證了,我做了個方法處理,代碼如下:
#include <map>
#include <list>
using namespace std;
class CTest
{
<span style="color:#ff0000;">protected:
CTest()
{
printf("construct CTest\n");
}</span>
public:
virtual ~CTest()
{
printf("Test\n");
}
};
class CTest2: public CTest
{
public:
void Add()
{
<span style="color:#ff0000;">CTest *lpTest = new CTest;</span>
CTest::~CTest();
}
};
void main()
{
CTest2 Test;
Test.Add();
//int nChars = getchar();
}
紅色的部分就是新增加的代碼:將基類的構造函數變爲protected屬性。如果構造函數能夠被繼承,那麼在CTest2裏面應該是編譯通過的,開始進行編譯,編譯出錯,提示
error C2248: 'CTest::CTest' : cannot access protected member declared in class 'CTest',果然編譯通不過。
得出結論:
析構函數被繼承過來了,但是構造函數不能夠繼承,我們在子類裏面只是”調用“基類的構造函數。