如何使用抽象类调用抽象函数

时间:2016-06-25 20:30:17

标签: c++ inheritance 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()没有继承?

1 个答案:

答案 0 :(得分:2)

它不起作用,因为/* Sort the array using Recursive insertion sort */ #include <stdio.h> #include <conio.h> void RecursiveInsertionSort(int a[], int); /* Recursively call the function to sort the array */ void RecursiveInsertionSort(int *a, int n) { int i,k; if (n > 1) RecursiveInsertionSort(a, n - 1);//Call recursively else { k = a[n]; i = n - 1; while (i >= 0 & & a[i] > k){ a[i + 1] = a[i]; //replace the bigger i = i - 1; } a[i + 1] = k; //Place the key in its proper position } } /* Main function */ void main() { int a[] = { 5,4,3,2,1 }; // Array unsorted declared RecursiveInsertionSort(a, 5);//call recursive function to sort the array in ascending order } 没有 df <- data.frame(C1 = c("1","0","0","1","1"), C2 = c(11,21,22,31,35)) df # C1 C2 # 1 1 11 # 2 0 21 # 3 0 22 # 4 1 31 # 5 1 35 One <- df[df$C1 == "1","C2"] Zero <- df[df$C1 == "0","C2"] One # [1] 11 31 35 Zero # [1] 21 22 n <- max(length(One),length(Zero)) n # 3 length(One) <- 3 length(Zero) <- 3 Result <- cbind(One,Zero) Result # One Zero # [1,] 11 21 # [2,] 31 22 # [3,] 35 NA ,只有B

如果f()没有任何名为f(int)的函数,那么将搜索超类的匹配函数,并发生重载决策。但是因为子类B已经有一个名为f的函数,所以不搜索超类,并且重载解析发生在B中。

这是f关键字的用途,使超类的B成为using命名空间的一部分。这里的答案是,“这是因为这就是C ++的工作方式”。