【问题标题】:How to call an abstract function with an abstract class如何用抽象类调用抽象函数
【发布时间】:2016-06-25 20:30:16
【问题描述】:

我想在调用抽象(虚拟)函数的抽象类中定义一个函数。但是当我从抽象类继承时,这个函数不会被继承:

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()没有被继承呢?

【问题讨论】:

  • A::f 继承,但被B::f(int)隐藏。找到名称时停止名称查找。论点是否匹配在这一点上无关紧要。更清楚的例子:如果B 定义了一个名为f 的成员变量而不是一个成员函数,那么A::f 也将找不到。如果你写b.A::f()而不是b.f(),你的程序将会编译。

标签: c++ inheritance abstract-class


【解决方案1】:

它不起作用,因为B 没有f(),只有f(int)

如果B 没有任何名为f 的函数,则将在超类中搜索匹配函数,并进行重载决策。但是因为子类B已经有一个名为f的函数,所以不会搜索超类,重载决议发生在B

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 2011-03-21
    相关资源
    最近更新 更多