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

How do I access to a function member of a derived class using a base class pointer when there are multiple derived classes?

本文关键字:派生 访问 指针 函数 基类 成员 何使用      更新时间:2023-10-16

假设我有一个基类A和三个从A派生的类x, y, z。现在,类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中写,不给任何内容。

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

在我看来,你有三个选择:

    重新设计,因为你的对象不正确。
  1. 实现一个基本函数,断言然后抛出
  2. 测试dynamic_cast<>的结果,如果返回null则失败。

然而,如果我在A中定义虚函数,我也需要在y和z中定义f,否则,会引发一个错误,说"y和z是抽象类类型"。

是不正确的。如果在基类a中定义了虚函数,那么无论是否在派生类中重写该函数,都应该能够很好地编译,除非显式地将该虚函数设置为纯函数。

如果这个基本虚函数不是纯的,如果你不在这些类中覆盖对象y或z,它将被默认调用,这就解决了问题。

否则,我将避免向下转换。如果由于驱动类有太多惟一的公共接口而导致虚函数出现问题,那么这就不是IS-A关系,是时候检查您的设计了。例如,对于共享功能,考虑组合,而不是继承……