当有多个派生类时,如何使用基类指针访问派生类的函数成员?
Posted
技术标签:
【中文标题】当有多个派生类时,如何使用基类指针访问派生类的函数成员?【英文标题】:How do I access to a function member of a derived class using a base class pointer when there are multiple derived classes? 【发布时间】:2016-10-25 15:47:22 【问题描述】:假设我有一个基类A
和三个来自A
的派生类,称为类x
、y
、z
。现在,x
类有一个函数成员f
,我想通过多态性从类A
指针访问它。
我知道我还必须在类A
中定义相应的虚函数,否则我会收到类似"class A has no member named f"
的错误。但是,如果我在A
中定义了虚函数,我还需要在y
和z
中定义f
,否则会引发一个错误,指出"y and z are of abstract class type"
。但有时,f
就像一个只与类x
相关的特征函数,在类y
和z
中定义没有意义,尽管我可以在y
和z
中编写它而不给出任何内容。
我的问题是在上述情况下,我该怎么办?
【问题讨论】:
重新设计您的类层次结构,以便想要调用f
的代码只获得对x
的引用或指针,而不是A
。
为什么不将 f 设为非纯虚拟并从基类提供默认实现。并且 f() 仅与 x 相关而不与 y 和 z 相关是不良继承的暗示
@LorenceHernandez 我想知道为什么您认为 f() 仅与 x 相关而不与 y 和 z 相关是不良继承的暗示。子类具有其父类没有的某些特性,而其他子类也没有,这不是很自然和普遍吗?谢谢
@Nicholas 我虽然你的 f() 在基类中被声明为纯虚拟,但我认为这只是一个误解?
【参考方案1】:
据我所知,您有 3 个选择:
-
重新设计,因为您的对象不正确。
实现一个断言然后抛出的基本函数
测试dynamic_cast的结果 - 如果返回null则失败。
【讨论】:
【参考方案2】:但是,如果我在A中定义虚函数,我还需要在y和z中定义f,否则会出现“y和z是抽象类类型”的错误。
这是不正确的。如果你在基类 A 中定义了一个虚函数,那么无论你是否在派生类中重写这个函数,你都应该编译得很好,除非你明确地将这个虚函数设为纯 ..
如果这个基本虚函数不是纯的,如果你不在这些类中覆盖它,它将默认为对象 y 或 z 调用,这解决了你的问题。
否则,我会避免向下转换。如果由于驱动类有太多独特的公共接口而对虚函数有问题,那么这不是 IS-A 关系,是时候审查您的设计了。例如,对于共享功能,考虑组合,而不是继承......
【讨论】:
以上是关于当有多个派生类时,如何使用基类指针访问派生类的函数成员?的主要内容,如果未能解决你的问题,请参考以下文章