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
几乎永远都是某些设计缺陷的证据。关于c++ - 从不同基类的基指针强制转换为基类(最好不使用dynamic_cast),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13566593/