C++ c++;关于继承、动态转换还是虚拟函数的设计问题?
我有一个基类,其中有一些私有成员,每个子类的类型都相同。每个子类都有自己的成员(有些成员比其他成员多)。我将指针存储在基类*类型列表中,指向每个子类成员 因此,我可以使用虚拟函数调用子类的公共成员。但在某些子类中,我不会有可替换的函数(但我认为这不是问题,除非我尝试将其调用到某个子类) 另一种方法是动态地将指针从基类转换到正确的子类,并调用其成员C++ c++;关于继承、动态转换还是虚拟函数的设计问题?,c++,inheritance,casting,C++,Inheritance,Casting,我有一个基类,其中有一些私有成员,每个子类的类型都相同。每个子类都有自己的成员(有些成员比其他成员多)。我将指针存储在基类*类型列表中,指向每个子类成员 因此,我可以使用虚拟函数调用子类的公共成员。但在某些子类中,我不会有可替换的函数(但我认为这不是问题,除非我尝试将其调用到某个子类) 另一种方法是动态地将指针从基类转换到正确的子类,并调用其成员 你会怎么做?为什么我要用一种方法而不是另一种 需要使用dynamic_cast通常表明设计中存在缺陷(或需要符合某些外部约束)。所以你应该设计成你不需
你会怎么做?为什么我要用一种方法而不是另一种 需要使用
dynamic_cast
通常表明设计中存在缺陷(或需要符合某些外部约束)。所以你应该设计成你不需要它
当以某种统一的方式处理不同类型的对象时,可以使用基本接口。这意味着基本接口应该足够完整,以提供在这种情况下需要执行的所有操作。如果某些操作对某些子类没有意义,则有两种可能的情况:
假设对象的序列是异构的,那么您似乎想使用
virtual
函数:使用dynamic\u cast()
往往速度很慢,如果您不知道对象的类型,则需要进行大量的强制转换
请注意,对于使用对象,数据成员实际上并不重要!您可以通过publuc函数查看对象。数据成员通常都是私有的(很少有例外,这些只是边界数据,例如,事件处理程序的注册表可能是公共数据成员)。您不太清楚要做什么。你能试着让你的问题更精确,或者包含示例代码吗?你想要什么还不是很清楚,你能发布一个你的类结构的例子吗?请看,当问“我该怎么做?”时,你应该发布一个你正在使用的代码示例,这样人们可以在上下文中回答你,而且当我们看到代码时,更容易理解你正在做/试图做什么。你是说如果我在我的基类中声明一个虚拟函数,在每个子类中都应该有一个同名的函数?那么最好是动态播放?@user2321611您不必这样做。您可能希望在基类函数中实现一些默认行为,例如引发异常。正如所说的,不要使用动态强制转换。