除了使用纯虚拟外,如何通过基类从派生类中获取成员

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 有什么关系? 我认为您的意思是,您想通过对 BGA 的基类)的引用访问 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 实际上不是Aa 将是NULL。但是,dynamic_cast 只能以这种方式与多态类一起使用:基类必须至少有一个 virtual 函数。 virtual 析构函数在这里会做得很好。

【讨论】:

@user1961415:已编辑。

以上是关于除了使用纯虚拟外,如何通过基类从派生类中获取成员的主要内容,如果未能解决你的问题,请参考以下文章

C++第八天笔记2016年02月25日(周四)A.M

继承知识总结

如何通过定义派生类的构造函数来实例化两个基类的私有数据成员?

虚基类在解决二义性中的问题中的作用是啥

C++基类和派生类的构造函数

在派生类中使用来自虚拟基类的受保护 ctor