2016-06-14 35 views
2

我一直认为基类的公有方法确实被派生类继承,甚至认为派生类没有定义该特定方法。例如如何调用未在派生类中定义的基类的函数?

#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,但我得到的编译错误说

错误:太多的参数函数调用,预期为0,有1个;你的意思” A :: f'

我知道错误是想说什么,但我有点困惑,基类的功能没有被调用。

+3

超载在派生类中的函数隐藏了所有的基类版本 –

+0

使用虚拟关键字A – ZivS

+1

我发现了一个从stackoverflow链接 - http://stackoverflow.com/questions/411103/function-with-same-n ame-but-different-signature-in-derived-class,它清楚地解释了这个问题。 – pokche

回答

6

在派生类中重载方法会隐藏所有基类版本。即使签名不同,如果派生类中存在与基类中名称相同的方法,那么您将无法直接调用基类版本。

你可以做

ob.A::f(7); 
2

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

  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); 
    
+0

@ R Sahu,但上述案例适用于Java。 – a874

+0

@ a874,我不熟悉Java。我无法对此发表评论。但是,这与它是否在C++中起作用无关。 –

2

您可以用另一种方式:

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

    }; 
相关问题