为啥我不能使用子类的指针访问基类的公共函数?

Posted

技术标签:

【中文标题】为啥我不能使用子类的指针访问基类的公共函数?【英文标题】:Why can I not access a public function of a base class with a pointer of a subClass?为什么我不能使用子类的指针访问基类的公共函数? 【发布时间】:2009-12-02 21:37:50 【问题描述】:

我不确定为什么会收到“错误 C2660: 'SubClass::Data' : function does not take 2 arguments”。当我尝试编译我的项目时。

我有一个基类,其中包含一个名为 data 的函数。该函数接受一个参数,有一个 Data 的重载需要 2 个参数。 在我的子类中,我覆盖了采用 1 个参数的数据函数。现在,当我尝试从指向子类的指针调用数据重载时,我收到上述编译错误。

class Base : public CDocument

Public:
virtual CString&    Data( UINT index);      
CString     Data( UINT index, int pos); 
;
class SubClass : public Base

Public:
virtual CString&    Data( UINT index);      

;

Void SomeOtherFunction()

subType* test = new subType();
test->Data( 1, 1);// will not compile
((Base*)test)->Data(1,1); // compiles with fine.

【问题讨论】:

什么是subType?它与SubClassbaseBase 有什么关系吗?请发布您正在使用的实际代码。 可能重复:***.com/questions/411103***.com/questions/1480085***.com/questions/1799497 是的,这个问题出现了很多。这是另一个:***.com/questions/888235/… 【参考方案1】:

C++ 编程语言,Bjarne Stroustrup 着(p. 392,第 2 版):

15.2.2 继承和使用声明 重载解决方案不适用于不同的类范围(第 7.4 节)……

您可以使用限定名称访问它:

void SomeOtherFunction()

  SubClass* test = new SubClass();

  test->Base::Data(1, 1);

或通过向SubClass 添加使用声明:

class SubClass : public Base

  public:
  using Base::Data;
  virtual CString& Data( UINT index);
;

void SomeOtherFunction()

  SubClass* test = new SubClass();

  test->Data(1, 1);

【讨论】:

【参考方案2】:

您在 SubClass 中对 Data(UINT index) 的覆盖“隐藏”了基类中的重载。

一种解决方案是像这样编写子类:

class SubClass : public Base

public:
using Base::Data;    // <--- brings all the overloads into scope
virtual CString&    Data( UINT index);          
;

现在test-&gt;Data(1,1) 应该可以工作了。

【讨论】:

【参考方案3】:

您必须在子类中使用 Base::Data 添加

查看第 33 条:避免隐藏 Effective C++ 的继承名称

【讨论】:

【参考方案4】:

这是hiding rule 试图保护你免受自己的伤害。

【讨论】:

【参考方案5】:

当您覆盖在基类中声明的函数时,具有该名称的所有其他函数都将隐藏在子类中。如前所述,您需要通过 using Base::Data 声明将这些名称纳入子类的范围。

【讨论】:

以上是关于为啥我不能使用子类的指针访问基类的公共函数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当从派生类访问基类的数据时它会返回废话(我认为是指针数据)

无法从基类指针访问子类方法

crfoJkvKsm

继承

C#中继承类为啥可以通过属性访问基类的私有字段。

为啥我可以通过指向派生对象的基类指针访问派生私有成员函数?