我有以下代碼:
struct Abs {
virtual void f(int x) = 0;
virtual void f(double x) final { std::cout << 2; }
};
struct Sub: public Abs {
void f(int x) final { std::cout << 1; }
};
Abs是一個抽象類,它包含一個純成員函式void f(int)及其多載版本void f(double x),不再是純和final. 如果我嘗試void f(int)在派生結構中覆寫Sub,它會隱藏void f(double)并main列印以下函式1,轉換1.01為int:
int main() {
Sub x = {};
x.f(1.01);
return 0;
}
我該如何克服這個問題?另外,為什么它會這樣作業?
uj5u.com熱心網友回復:
給定x.f(1.01);,名稱f在 class 的范圍內找到Sub,然后名稱查找停止;的范圍Abs不會被審查。只會Sub::f被放入多載集合,然后執行多載決議。
...名稱查找按如下所述檢查作用域,直到它找到至少一個任何型別的宣告,此時查找停止并且不再檢查進一步的作用域。
您可以使用using引入Absinto的名稱Sub,然后Abs::f也可以找到并參與多載決議。
struct Sub: public Abs {
using Abs::f;
void f(int x) final { std::cout << 1; }
};
uj5u.com熱心網友回復:
您必須將該using子句添加到您的派生類中以從基類中選擇所有多載。
struct Abs {
virtual void f(int x) = 0;
virtual void f(double x) final {std::cout << 2;}
};
struct Sub: public Abs {
using Abs::f; // << this one did the trick
void f(int x) final { std::cout << 1; }
};
int main() {
Sub x = {};
x.f(1.01);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/386954.html
