Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;关于继承、动态转换还是虚拟函数的设计问题?_C++_Inheritance_Casting - Fatal编程技术网

C++ c++;关于继承、动态转换还是虚拟函数的设计问题?

C++ c++;关于继承、动态转换还是虚拟函数的设计问题?,c++,inheritance,casting,C++,Inheritance,Casting,我有一个基类,其中有一些私有成员,每个子类的类型都相同。每个子类都有自己的成员(有些成员比其他成员多)。我将指针存储在基类*类型列表中,指向每个子类成员 因此,我可以使用虚拟函数调用子类的公共成员。但在某些子类中,我不会有可替换的函数(但我认为这不是问题,除非我尝试将其调用到某个子类) 另一种方法是动态地将指针从基类转换到正确的子类,并调用其成员 你会怎么做?为什么我要用一种方法而不是另一种 需要使用dynamic_cast通常表明设计中存在缺陷(或需要符合某些外部约束)。所以你应该设计成你不需

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

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


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

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

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

  • 该操作对于子类来说是不可操作的,但它仍然构成了如何使用该类的一部分。在这种情况下,只需将子类函数实现为空

  • 这个操作对于子类来说毫无意义。在这种情况下,它可能不应该是基本接口的一部分,更重要的是,在那里不应该需要它。如果您需要特定于子类的功能,那么在处理泛型集合时可能不需要它。这是您的设计应该确保的


  • 假设对象的序列是异构的,那么您似乎想使用
    virtual
    函数:使用
    dynamic\u cast()
    往往速度很慢,如果您不知道对象的类型,则需要进行大量的强制转换


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

    您不太清楚要做什么。你能试着让你的问题更精确,或者包含示例代码吗?你想要什么还不是很清楚,你能发布一个你的类结构的例子吗?请看,当问“我该怎么做?”时,你应该发布一个你正在使用的代码示例,这样人们可以在上下文中回答你,而且当我们看到代码时,更容易理解你正在做/试图做什么。你是说如果我在我的基类中声明一个虚拟函数,在每个子类中都应该有一个同名的函数?那么最好是动态播放?@user2321611您不必这样做。您可能希望在基类函数中实现一些默认行为,例如引发异常。正如所说的,不要使用动态强制转换。