对继承的类隐藏的名称
Name hiding from inherited classes
我有以下示例代码,我想知道在 CBar 类中访问 Pass 方法的正确方法。 目前,我找到了3种访问此方法的方法,它们如下:
- 强制转换对象,((CBar *) &foo)->Pass(1, 2, 3);
- 使用此语法,foo。CBar::P ass(1,2,3);
- 在 CFoo 类声明中使用 "using" 语法,使用 CBar::P ass。
下面是用于测试此功能的简单项目的示例。
福.h
#include "bar.h"
class CFoo :
public CBar
{
private:
double m_a;
double m_b;
public:
CFoo(void);
~CFoo(void);
void Pass(double a, double b);
};
福.cpp
#include "Foo.h"
CFoo::CFoo(void)
{
m_a = 0.0;
m_b = 0.0;
}
CFoo::~CFoo(void)
{
}
void CFoo::Pass(double a, double b)
{
m_a = a;
m_b = b;
}
酒吧
class CBar
{
int m_x;
int m_y;
int m_z;
public:
CBar(void);
~CBar(void);
void Pass(int x, int y, int z);
};
酒吧.cpp
#include "Bar.h"
CBar::CBar(void)
{
m_x = 0;
m_y = 0;
m_z = 0;
}
CBar::~CBar(void)
{
}
void CBar::Pass(int x, int y, int z)
{
m_x = x;
m_y = y;
m_z = z;
}
我的主要课程DoStuff.cpp
#include "DoStuff.h"
#include "Foo.h"
CDoStuff::CDoStuff(void)
{
}
CDoStuff::~CDoStuff(void)
{
}
int main()
{
CFoo foo, foo1, foo2;
//This only gets to the Pass method in Foo.
foo.Pass(2.5, 3.5);
//Gets access to Pass method in Bar.
foo1.CBar::Pass(5,10,15);
//Can also case and access by location for the same result??
((CBar *) &foo2)->Pass(100,200,300);
return 0;
}
这些选项中的每一个都可行吗? 是首选吗? 使用列出的任何一种方法是否存在陷阱?
我对foo特别好奇。CBar::P ass(1,2,3) 语法。
谢谢
乙
在此特定示例中,所有方法最终都会产生相同的结果。
一般来说,结果可能会有所不同。
如果"cast"方法恰好是虚函数,((CBar *) &foo)->Pass(1, 2, 3);
将保留调用的动态性质Pass
。可以按照参考类型、BTW ((CBar &) foo).Pass(1, 2, 3);
进行铸造。在这种情况下,使用C++样式的转换是一个更好的主意。
如果"限定名"方法恰好是虚函数Pass
,foo.CBar::Pass(1,2,3);
将抑制调用的动态性质,即保证调用CBar::Pass
。
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 名称隐藏对静态函数继承的实例使用
- C++继承模板类:隐藏成员变量
- QScopedPointer 是否隐藏了多重继承
- 在继承的类构造函数中使用隐藏成员
- 使用私有继承来隐藏实现是个好主意吗
- C++隐藏继承的类
- 由多重继承隐藏的嵌套类
- 对继承的类隐藏的名称
- 具有不同签名的两个函数的继承隐藏了非虚函数
- 我如何使用接口隐藏我的实现,并且仍然使用继承构建类
- 为什么继承的函数隐藏在这个代码的基类中
- C++通过继承隐藏变量
- c++继承和名称隐藏
- 在c++中使用私有继承时是否可能隐藏重载方法?
- 访问隐藏的继承成员
- c++继承名称隐藏
- 部分隐藏的继承树
- 我如何使用 no除非我从继承列表中选择特定的隐藏函数