当有多个派生类时,如何使用基类指针访问派生类的函数成员?

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 的派生类,称为类xyz。现在,x 类有一个函数成员f,我想通过多态性从类A 指针访问它。

我知道我还必须在类A 中定义相应的虚函数,否则我会收到类似"class A has no member named f" 的错误。但是,如果我在A 中定义了虚函数,我还需要在yz 中定义f,否则会引发一个错误,指出"y and z are of abstract class type"。但有时,f 就像一个只与类x 相关的特征函数,在类yz 中定义没有意义,尽管我可以在yz 中编写它而不给出任何内容。

我的问题是在上述情况下,我该怎么办?

【问题讨论】:

重新设计您的类层次结构,以便想要调用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 关系,是时候审查您的设计了。例如,对于共享功能,考虑组合,而不是继承......

【讨论】:

以上是关于当有多个派生类时,如何使用基类指针访问派生类的函数成员?的主要内容,如果未能解决你的问题,请参考以下文章

c ++:将指针传递给基类时访问派生类方法?

关于C++基类、派生类的引用和指针

在 C++ 中将指向基类的指针传递给派生类的成员函数

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

虚函数和基类中的this指针的问题!

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