2016-10-25 156 views
1

假设我有一个基类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中没有给出任何内容。

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

+2

重新设计您的类层次结构,以便只调用'f'的代码只获取引用或指向'x'的指针,而不是'A'。 –

+2

为什么不使f非纯虚拟,并给予基类的默认实现。并有f()只与x有关,而不是在y和z是暗示遗传不良 –

+0

@LorenceHernandez我想知道为什么你认为* f()只与x有关,而不是y和z是不良继承的提示*。孩子班有其父母班没有的某些功能,其他的孩子班是不是也很自然和普遍?谢谢 – Nicholas

回答

3

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

  1. 重新设计,因为你的对象是不正确的。
  2. 执行一个基本函数,该函数声明并然后抛出
  3. 测试dynamic_cast的结果<> - 然后如果返回null则失败。
1

但是,如果我定义A中的虚拟函数,我还需要在y和z定义女,否则,一个错误说,“y和z是抽象类类型”被升高。

这是不正确的。如果你在一个基类A中定义了一个虚拟函数,那么你应该编译你是否在你的派生类中重写这个函数,除非你明确地使这个虚函数是纯粹的..

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

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

相关问题