当有多个派生类时,如何使用基类指针访问派生类的函数成员?
How do I access to a function member of a derived class using a base class pointer when there are multiple derived classes?
假设我有一个基类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
中写,不给任何内容。
我的问题是在上述情况下,我该怎么办?
在我看来,你有三个选择:
- 重新设计,因为你的对象不正确。
- 实现一个基本函数,断言然后抛出
- 测试dynamic_cast<>的结果,如果返回null则失败。
然而,如果我在A中定义虚函数,我也需要在y和z中定义f,否则,会引发一个错误,说"y和z是抽象类类型"。
是不正确的。如果在基类a中定义了虚函数,那么无论是否在派生类中重写该函数,都应该能够很好地编译,除非显式地将该虚函数设置为纯函数。
如果这个基本虚函数不是纯的,如果你不在这些类中覆盖对象y或z,它将被默认调用,这就解决了问题。
否则,我将避免向下转换。如果由于驱动类有太多惟一的公共接口而导致虚函数出现问题,那么这就不是IS-A关系,是时候检查您的设计了。例如,对于共享功能,考虑组合,而不是继承……
相关文章:
- 如何使用单独文件中的派生类访问友元函数对象
- 为什么此派生对象无法访问基类的后递减方法?
- C++:为什么无法在派生类中访问受保护的构造函数?
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 派生的 wxPanel 控件如何访问其中包含 wxDialog 中的数据?
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- C ++基础私有方法在将自身转换为派生类后可以访问吗?
- 按基类对象访问派生类资源时出错
- 使(虚拟)函数在大多数派生类中无法访问中间基类中可访问,定义良好?
- 从模板化父类中的派生内部类访问受保护的成员变量
- 如何从派生类访问基类中的重载运算符?
- 两个抽象类,派生自同一个基类.如何访问从一个抽象类到另一个抽象类的指针
- C++11: 如何访问派生类中的基类成员?
- 访问派生类的 QMetaObject
- 使用基类对象访问派生的仅类方法
- 如何在 c++ 中通过基类引用访问派生类的对象?
- 派生类无法访问基类的受保护成员
- 如何在 c++ 中使用多态性访问派生类字段?
- 为了访问方法,从基类动态转换为派生类
- C++继承从基类指针访问派生类中的非虚拟函数