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

时间:2016-10-25 15:47:22

标签: c++ pointers inheritance polymorphism

假设我有一个基类A和三个来自A的派生类,称为类xyz。现在,类x有一个函数成员f,我希望通过多态从类A指针访问它。

我知道我还必须在类A中定义相应的虚函数,否则,我会得到类似"class A has no member named f"的错误。但是,如果我在A中定义虚拟函数,我还需要在fy中定义z,否则会出现"y and z are of abstract class type"的错误提高。但有时,f就像一个仅与类x相关的特征函数,在类yz中定义没有任何意义,尽管我可以在{{y中编写它。 1}}和z没有提供任何内容。

我的问题是在上面的场景中,我该怎么办?

2 个答案:

答案 0 :(得分:3)

从我所看到的,你有3个选择:

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

答案 1 :(得分:1)

  

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

这不正确。如果您在基类A中定义了一个虚函数,那么无论您是否在派生类中重写此函数,都应该编译好,除非您明确地将此虚函数设为纯函数。

如果这个基本虚函数不是纯函数,默认情况下会为对象y或z调用它,如果你不在这些类中覆盖它,这可以解决你的问题。

否则,我会避免向下投射。如果您的虚拟功能有问题,因为您的驱动类有太多独特的公共接口,那么它不是IS-A关系,是时候审查您的设计了。例如,对于共享功能,请考虑组合,而不是继承......