簡體   English   中英

如何使用抽象類調用抽象函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM