繁体   English   中英

从不同基类的基指针转换为基类(最好没有dynamic_cast)

[英]Cast to base class from base pointer from different base class (preferably without dynamic_cast)

class Model {};

class AbstractModel {};
class TableModel : public AbstractModel {};

class CustomerModel : public TableModel, public Model {};
class ItemModel : public TableModel, public Model {};
...

要求是每个TableModel子类必须提供在所有子类(CustomerModel,ItemModel,...)之间共享的一组功能。 由于TableModel和AbstractModel是不可变的,因此功能集在Model类中定义,并在每个子类(CustomerModel,ItemModel,...)中实现。

现在的问题是应用程序的其他部分只能访问AbstractModel指针,并且为了访问Model中定义的一组功能,这个指针必须从AbstractModel转换为Model(我们假设每个TableModel子类也实现Model )。

没有使用dynamic_cast,是否有可能这样做? 对提供相同功能的不同设计的任何建议?

首先,没有dynamic_cast ,这是不可能的。 但是你的要求听起来有点奇怪。 “每个TableModel子类必须提供一组功能”听起来很像TableModel应该通过使用纯虚函数来定义该设置。 你说的TableModel是不变的,所以我想你从某种库/框架得到它,并实现自己的一套子类的,这是的,我们正在谈论的要求设置。 在这种情况下,我建议您派生一个TableModel的抽象类,将您的需求定义为纯虚函数,并从该抽象类派生实际实现:

//immutable/library
class AbstractModel {};
class TableModel : public AbstractModel {};

//your code:
class MyOwnTableModel : public TableModel
{
public: 
  void implementThisRequrement() = 0;
};

class CustomerModel : public MyOwnTableModel { /*...*/ };
class ItemModel : public MyOwnTableModel { /*...*/ };

之后,您需要做的就是从AbstractModel到MyOwnTableModel的简单向下转换( dynamic_cast ),无需交叉投射。 但是,如果您可以告诉我们更多关于您的设计的信息,可能会有一个更简单,更好的解决方案 - dynamic_cast几乎可以证明某些设计缺陷。

首先,为什么不使用dynamic_cast?

第二,为什么不让TableModel继承Model? (毕竟,“表模型”听起来像是“模型”的专用版本)

通过“不可变”,你的意思是在Java / .NET意义上,对象在创建后不能改变其状态吗? 或者你的意思是你不能改变课程,因为他们是某些图书馆的一部分? 我的第一个猜测是第一个。

如果您不想使用dynamic_cast(这是C ++的RTTI功能的一部分),您将必须实现自己的RTTI形式。 例如,Microsoft的MFC通过从包含运行时类型信息的CObject超类派生所有类来实现此目的。 Microsoft COM也通过要求所有接口派生自IUnknown接口来实现这一点,IUnknown接口包含一个QueryInterface方法,该方法基本上等同于dynamic_cast。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM