关于继承,动态转换或虚函数的c ++设计问题?

时间:2013-11-29 18:55:40

标签: c++ inheritance casting

我有一个基类,其中包含一些私有成员,每个子类具有相同的类型。每个子类都有自己的成员(有些人比其他成员更多)。我将指针存储在每个子类成员的baseclass *类型列表中。

所以我可以使用虚函数来调用我的子类的公共成员。但是在一些子类中我不会有替换函数。(但我不认为这是一个问题,除非我尝试将其调用到某个子类) 另一种方法是将指针从基类动态转换为右子类并调用其成员。

你会怎么做?为什么我会使用一种方法而不是另一种方法呢?

2 个答案:

答案 0 :(得分:2)

需要使用dynamic_cast通常表明设计存在缺陷(或需要符合某些外部约束)。所以你应该设计你不需要它。

当您以统一的方式处理不同类型的对象时,可以使用基本界面。这意味着基本接口应足够完整,以提供您希望在这种情况下执行的所有操作。如果某些操作对某些子类没有意义,则有两种可能的情况:

  1. 该操作是子类的无操作,但它仍然构成了如何使用该类的一部分。在这种情况下,只需将子类函数实现为空。

  2. 该操作对子类没有任何意义。在这种情况下,它可能不应该是基本接口的一部分,更重要的是,它不应该在那里需要。如果您需要特定于子类的功能,则在处理泛型集合时可能不需要它。那就是你的设计应该保证的。

答案 1 :(得分:1)

似乎你想使用virtual函数假设你有对象的异构序列:使用dynamic_cast<>()往往很慢,如果你不知道对象的类型你会需要投入很多。

请注意,对于使用对象数据,成员实际上无关紧要!您可以通过publuc函数查看对象。数据成员通常都是私有的(很少有例外,这些只是临界数据,例如,事件处理程序的注册表可能是公共数据成员)。