使用具有同名方法的派生类对象访问基类的方法

Posted

技术标签:

【中文标题】使用具有同名方法的派生类对象访问基类的方法【英文标题】:Accessing base class's method with derived class's object which has a method of same name 【发布时间】:2010-03-13 07:07:07 【问题描述】:

当使用派生类的对象访问“base”的 foo() 时。

#include <iostream>

class  base

      public:
      void foo()
     
        std::cout<<"\nHello from foo\n";
     
;

class derived : public base

     public:
     void foo(int k)
     
        std::cout<<"\nHello from foo with value = "<<k<<"\n";
     
;
int main()

      derived d;
      d.foo();//error:no matching for derived::foo()
      d.foo(10);


如何访问派生类中具有同名方法的基类方法。 已显示生成的错误。 如果我不清楚,我很抱歉,但我觉得我已经让自己像水一样清澈。 提前致谢。

【问题讨论】:

How to call a parent class function from derived class function?的可能重复 【参考方案1】:

您可以将using base::foo 添加到您的派生类中:

class derived : public base

public:
     using base::foo;
     void foo(int k)
     
        std::cout<<"\nHello from foo with value = "<<k<<"\n";
     
;

编辑:this question 的答案解释了为什么您的 base::foo() 在没有 using 声明的情况下不能从 derived 直接使用。

【讨论】:

但是为什么基类的 foo() 不能在派生类中访问,而我继承了该基类... @ashish:它是可访问的(表示公共/受保护/私有的访问说明符),但它是隐藏的。阅读 Josh 链接的问题:***.com/questions/1628768/… 哦,哇,我正要创建包装器来委托给隐藏的基本重载,只是为了将它们从派生对象中公开,有点像void foo() base::foo() ,然后想一定有更好的方法来做到这一点,谢天谢地,是的。也可以选择d.base::foo(),但从客户端的角度来看,这似乎有点烦人。【参考方案2】:
d.base::foo();

【讨论】:

【参考方案3】:

在派生类中添加以下语句:

using Base::foo ;

这应该可以达到目的。

当您在派生类中有一个与基类中的函数同名的函数时,基类的所有函数都是隐藏的,您必须明确地将它们带入派生类的范围内。

【讨论】:

【参考方案4】:

我们可以使用派生类对象调用基类方法。按照下面的代码。

#include<iostream.h>
class base

public:
void fun()

    cout<<"base class\n";

;
class der : public base

public:
void fun()

cout<<"derived class\n";

;
int main()


der d1;


d1.base::fun();


return 0;
 

输出将是基类。

【讨论】:

以上是关于使用具有同名方法的派生类对象访问基类的方法的主要内容,如果未能解决你的问题,请参考以下文章

C#:基类中的受保护方法;无法使用来自另一个类的派生类对象进行访问[重复]

6多态性-3虚函数

实验五 类的继承派生和多态

C#编程,关于基类和派生类

不是抽象类的基类不是好基类

从基类类型的向量访问派生类方法