C++的一些語法(調用父類的同名函數)
前段時間,在改程序的時候,突然卡在了C++的一個語法問題上。心想也算是用了好些年的C++的,怎麼就出現這樣的問題呢?
接下來就來說說這個問題吧。
// 測試基類
struct Test_A
{
void print(int a)
{ printf("fuck\n"); }
};
// 測試子類
struct Test_B : public Test_A
{
void print()
{ printf("shit\n"); }
};
void main()
{
Test_B tb;
// 在此我想要通過tb調用基類的print函數
tb.print(0); // 在此卻編譯不過。 'Test_B::print' :function does not take 1 arguments
}
遇到這個編譯報錯,我就傻眼了。函數在子類和父類中雖然同名,可簽名不同啊,怎麼就出現這樣的報錯。真是百思不得其解啊。於是嘗試着用其他方法調用父類的同名函數。
void main()
{
Test_B tb;
// 在此我想要通過tb調用基類的print函數
//tb.print(0); // 在此卻編譯不過。 'Test_B::print' : function does not take 1 arguments
static_cast<Test_A*>(&tb)->print(0);
}
雖然寫法醜了點,可算是能夠成功編譯了。調試調用也沒有什麼問題。可畢竟寫法還是不好看。於是又嘗用其他的辦法,在此突然意識到C++好像可以這樣顯示的調用父類成員方法。
void main()
{
Test_B tb;
// 在此我想要通過tb調用基類的print函數
//tb.print(0); // 在此卻編譯不過。 'Test_B::print' : function does not take 1 arguments
// 成功
//static_cast<Test_A*>(&tb)->print(0);
// 成功
tb.Test_A::print(0);
}
到此也算是圓滿解決這個小問題了。只是還是有點感慨啊,這語法規則…
(vc2010環境)