为啥我不能使用子类的指针访问基类的公共函数?
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
?它与SubClass
、base
和Base
有什么关系吗?请发布您正在使用的实际代码。
可能重复:***.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->Data(1,1)
应该可以工作了。
【讨论】:
【参考方案3】:您必须在子类中使用 Base::Data 添加
查看第 33 条:避免隐藏 Effective C++ 的继承名称
【讨论】:
【参考方案4】:这是hiding rule 试图保护你免受自己的伤害。
【讨论】:
【参考方案5】:当您覆盖在基类中声明的函数时,具有该名称的所有其他函数都将隐藏在子类中。如前所述,您需要通过 using Base::Data 声明将这些名称纳入子类的范围。
【讨论】:
以上是关于为啥我不能使用子类的指针访问基类的公共函数?的主要内容,如果未能解决你的问题,请参考以下文章