我有一个基类,其中包含一些私有成员,每个子类具有相同的类型。每个子类都有自己的成员(有些人比其他成员更多)。我将指针存储在每个子类成员的baseclass *类型列表中。
所以我可以使用虚函数来调用我的子类的公共成员。但是在一些子类中我不会有替换函数。(但我不认为这是一个问题,除非我尝试将其调用到某个子类) 另一种方法是将指针从基类动态转换为右子类并调用其成员。
你会怎么做?为什么我会使用一种方法而不是另一种方法呢?
答案 0 :(得分:2)
需要使用dynamic_cast
通常表明设计存在缺陷(或需要符合某些外部约束)。所以你应该设计你不需要它。
当您以统一的方式处理不同类型的对象时,可以使用基本界面。这意味着基本接口应足够完整,以提供您希望在这种情况下执行的所有操作。如果某些操作对某些子类没有意义,则有两种可能的情况:
该操作是子类的无操作,但它仍然构成了如何使用该类的一部分。在这种情况下,只需将子类函数实现为空。
该操作对子类没有任何意义。在这种情况下,它可能不应该是基本接口的一部分,更重要的是,它不应该在那里需要。如果您需要特定于子类的功能,则在处理泛型集合时可能不需要它。那就是你的设计应该保证的。
答案 1 :(得分:1)
似乎你想使用virtual
函数假设你有对象的异构序列:使用dynamic_cast<>()
往往很慢,如果你不知道对象的类型你会需要投入很多。
请注意,对于使用对象数据,成员实际上无关紧要!您可以通过publuc函数查看对象。数据成员通常都是私有的(很少有例外,这些只是临界数据,例如,事件处理程序的注册表可能是公共数据成员)。