C++ 关于多态成员的设计决策

C++ 关于多态成员的设计决策,c++,polymorphism,C++,Polymorphism,我试图设计一些不依赖铸造的东西。我问了一个问题,我相信最终会有更好的办法,所以我在征求意见 我有一个泛型对象,其中会有子类 我有一个通用的节点对象,其中包含一个指向对象的指针作为成员节点s可以子类化,以提供有关如何处理其对象的更具体行为,以及设置特定节点使用的子类对象的类型 问题是,我的基类需要作为成员Object*myObject,以便我的应用程序可以遍历所有节点s,并在所有myObjects上调用draw函数 但是如何处理子类节点在子类对象上调用自定义函数的情况呢?这些函数可能是唯一的,在基

我试图设计一些不依赖铸造的东西。我问了一个问题,我相信最终会有更好的办法,所以我在征求意见

我有一个泛型
对象
,其中会有子类

我有一个通用的
节点
对象,其中包含一个指向
对象
的指针作为成员<代码>节点s可以子类化,以提供有关如何处理其
对象
的更具体行为,以及设置特定节点使用的子类对象的类型

问题是,我的基类需要作为成员
Object*myObject
,以便我的应用程序可以遍历所有
节点
s,并在所有
myObject
s上调用
draw
函数

但是如何处理子类节点在子类对象上调用自定义函数的情况呢?这些函数可能是唯一的,在基类中没有位置

我考虑的一个选项是子类将其指针成员存储为
MyObjectSubclass*myObject
,但子类不能重写基类成员,对吗?所以这真的不起作用


对于这种类型的设计,如果您能提供更有经验的建议,我将不胜感激。

使用接口。让每个对象子对象从适合该类的接口继承,并为基本对象类提供一个可以检索接口的方法


这就是微软COM的工作方式。

@Fellowshee,双重或更多。需要多少接口就有多少。@Fellowshee,事实上,您的基类也可以是接口,例如idravable。为什么认为它比使用
dynamic\u cast
更好?通过让对象提供那个些你们违反的接口,
类应该对扩展开放,但对修改关闭,因为若你们添加了更多的子类,你们就必须修改基类。同时,从基类查询子类接口也可能返回
nullptr
——与
dynamic\u cast
相同,虽然
dynamic\u cast
没有违反
扩展/修改
principle@Andrew我同意这是一个令人困惑的命题,如果没有具体的例子,我无法完全理解它在本案中的相关性或威力。我怀疑对于我的用例有更好的解决方案。我发现了一个5年前的问题,并且给出了一个相当自信的答案,这表明在这种情况下向下投射是完全可以接受的。这个问题与我上面的问题非常相似: