[英]overloading base class method in derived class
我試圖理解為什么以下代碼無法編譯,顯然該解決方案依賴於在派生類中專門聲明對 method_A 的依賴。 請參考以下代碼:
class Base
{
public:
void method_A(int param, int param2)
{
std::cout << "Base call A" << std::endl;
}
};
//does not compile
class Derived : public Base
{
public:
void method_A(int param)
{
std::cout << "Derived call A" << std::endl;
}
};
//compiles
class Derived2 : public Base
{
public:
using Base::method_A; //compile
void method_A(int param)
{
std::cout << "Derived call A" << std::endl;
}
};
int main ()
{
Derived myDerived;
myDerived.method_A(1);
myDerived.method_A(1,2);
Derived2 myDerived2;
myDerived2.method_A(1);
myDerived2.method_A(1,2);
return 0;
}
"test.cpp", (S) 為 "Derived::method_A(int)" 指定了錯誤數量的參數。
阻止派生類知道其基類正在實現它試圖重載的方法的技術原因是什么? 我正在尋找更好地理解編譯器/鏈接器在這種情況下的行為方式。
它被稱為名稱隱藏。 當您定義與 Base 方法同名的非虛擬方法時,它會隱藏派生類中的 Base 類方法,因此您會收到以下錯誤
myDerived.method_A(1,2);
為避免在派生類中隱藏基類方法,請像在派生2 類中一樣使用關鍵字。
另外,如果你想讓它工作,你可以明確地做到
myDerived.Base::method_A(1,2);
查看這個以獲得更好的解釋為什么名稱隱藏會出現。
好吧,對於你要打電話的人
myDerived.method_A(1,2);
有 2 個參數,而無論是在 base 中還是在 Derived 中,該方法都被聲明為只接受一個參數。
其次,您沒有覆蓋任何內容,因為 method_A 不是虛擬的。 你超載了。
如果您打算覆蓋void Base::method_A(int param, int param2)
那么您應該在基類中將其標記為 virtual :
virtual void method_A(int param, int param2)
任何覆蓋 this 的函數都必須具有相同的參數和幾乎相同的返回類型(“幾乎”意味着不同的返回類型必須是多態相關的,但在大多數情況下,它應該具有相同的返回類型)。
您當前所做的就是重載基類中的函數。 using
關鍵字將基類函數帶入子類的命名空間,因為默認情況下語言行為不這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.