除了使用纯虚拟外,如何通过基类从派生类中获取成员
Posted
技术标签:
【中文标题】除了使用纯虚拟外,如何通过基类从派生类中获取成员【英文标题】:how to get a member from derived class through the base class except using pure virtual 【发布时间】:2013-12-10 15:00:22 【问题描述】:我有 G 课。
B 类:公共 G
A 类:公共 B
D 类:公共 G
C 类:公共 D
F 类:公共 G
E 类:公共 F
从另一个班级,我可以访问 G(G 对不起!!)。我必须得到一些 A 类成员(例如,字符串 m_Astr)。
如何访问 A 字符串?如果我在 G 类中使用纯虚函数,除了 A 的实现,我还必须在 E 和 C 中实现这个 getStr 函数,而且我只需要 A。
请帮忙
【问题讨论】:
您的E
对象与任何A
有什么关系?
我认为您的意思是,您想通过对 B
或 G
(A
的基类)的引用访问 A
,而不是 E
(一个不相关的类,哪个不能是A
) 的实例?在第一种情况下,dynamic_cast
可能是您想要的;第二个,你不能,因为没有A
可以访问。
A 既不是 E 的祖先也不是 E 的后代。
对不起!我的意思是 G,而不是 E.. 已编辑 :(
是的,迈克,G,(不是 E)。你能解释一下如何使用动态演员吗?
【参考方案1】:
如果你知道(不知何故)指向的对象实际上是A
的一个实例,那么你可以使用static_cast
:
G* p = get_the_thing();
A* a = static_cast <A*> (p); // OK
但是,如果上面p
指向的对象没有实例化A
,那么上面的代码将产生未定义的行为。
更安全的方法是使用dynamic_cast
,
G* p = get_the_thing();
A* a = dynamic_cast <A*> (p); // OK
这里,如果p
实际上不是A
,a
将是NULL
。但是,dynamic_cast
只能以这种方式与多态类一起使用:基类必须至少有一个 virtual
函数。 virtual
析构函数在这里会做得很好。
【讨论】:
@user1961415:已编辑。以上是关于除了使用纯虚拟外,如何通过基类从派生类中获取成员的主要内容,如果未能解决你的问题,请参考以下文章