如何调用未在派生类中定义的基类函数?

时间:2016-06-14 04:54:51

标签: c++

我一直认为基类的公共方法确实被派生类继承,甚至认为派生类没有定义该特定方法。例如

#include <iostream>

using namespace std;


    class A {
    public:
        int f() { cout << 3; return 0;}
        int f(int x) {cout << x; return 0;}
    }; 

    class B: public A {
    public:
        int f() {std::cout << 5; return 0;}

    };


    int main(){
       B ob;
       ob.f(7); 

       return 0;
    }

我期待结果为:7,但是我收到编译错误

&#34; 错误:函数调用的参数太多,预期为0,有1;你的意思是&#39; A :: f&#39;?&#34;

我知道错误试图说的是什么,但我很困惑,没有调用Base类的功能。

3 个答案:

答案 0 :(得分:6)

在派生类中重载方法会隐藏所有基类版本。即使签名不同。如果一个与基类同名的方法存在于派生类中,那么你将无法直接调用base班级版本。

你可以做到

  ob.A::f(7);

答案 1 :(得分:2)

使用您发布的代码,B::f会隐藏A::f的所有版本。您可以使用几种方法从A::f(int)类型的对象中调用B

  1. 明确使用A::f

    B ob;
    ob.A::f(7); 
    
  2. A::f的所有版本纳入B的范围。

    class B: public A {
       public:
          using A::f;
          int f() {std::cout << 5; return 0;}
    
    };
    

    现在你可以使用:

    B ob;
    ob.f(7); 
    

答案 2 :(得分:2)

您可以使用其他方式:

class B: public A {
    public:
        using A::f;
        int f() {std::cout << 5; return 0;}

    };