[英]How to call an abstract function with an abstract class
我想在一個抽象類中定義一個函數,該類調用一個抽象(虛擬)函數。 但是當我從抽象類繼承時,此函數不會被繼承:
class A {
public:
virtual void f(int t) = 0;
void f() {
f(0);
}
};
class B : public A {
public:
void f(int t) override { }
// using A::f; // uncomment to fix the problem
};
int main() {
B b;
b.f(0); // works
b.f(); // error: no matching function for call to ‘B::f()’
}
為什么不起作用? 解決方法是using A::f
來使用,但是為什么A::f()
不被繼承?
它不起作用,因為B
沒有f()
,只有f(int)
。
如果B
沒有任何名為f
函數,則將在超類中搜索匹配的函數,並進行重載解析。 但是由於子類B
已經具有名為f
的函數,因此不會搜索超類,並且超載解析發生在B
。
這就是using
關鍵字的作用,以使超類的f()
成為B
命名空間的一部分。 答案確實是,“那是因為這就是C ++的工作方式”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.