C ++:没有虚拟性的继承

时间:2012-05-23 13:02:46

标签: c++ polymorphism virtual

我想知道我目前正在做的事情是否是C ++的耻辱,或者它是否正常。

我正在编写用于计算目的的代码。对于某些类,我使用具有虚拟/多态的正常继承方案。但我需要一些类来进行密集计算,因此避免由于虚拟性而产生的开销会很好。

基本上,我想在没有指针或重定向的情况下使用这个类:继承只是为了避免许多代码的复制/粘贴(基类的文件大小就像60Ko(这是很多代码))。所以没有虚函数,也没有虚拟析构函数。

我想知道从C ++的角度来看是否完全没问题,或者它是否会产生副作用(相关的类会在程序中被大量使用)。

非常感谢。

6 个答案:

答案 0 :(得分:5)

在C ++中使用多态性既不好也不坏。多态性有一个目的,缺乏多态性也是如此。在不使用多态的情况下使用继承没有任何问题。

由于多态性有一个目的,并且多态性的缺乏也有用,因此您应该考虑到这些目的来设计类。例如,如果您需要将行为绑定到类实例,则需要多态性。

尽管如此,选择一种方法胜过另一种方法有正确和错误的理由。如果你正在设计你的类没有多态,严格因为你想“避免开销”这可能是一个错误的原因。这是一个过早优化的实例,只要您在没有对代码进行分析并且证明多态性是实际问题的情况下进行设计更改或决策。

首先根据建筑要求进行设计。如果设计被证明是不具备性能的话,请稍后返回并重构。

答案 1 :(得分:4)

我会改写这个问题:

  

如果你避开多态,那么继承会带来什么组合无法实现?

如果答案是什么,我怀疑,那么也许首先不需要继承。

答案 2 :(得分:3)

不使用virtual成员/继承是完全可以的。 C ++旨在招待广大受众,并不限制任何人使用特定的范例。

您可以使用C ++编写程序,通用,面向对象或它们的任意组合。试着充分利用它。

  

我目前正在做的是C ++的耻辱,或者它是否正常。

完全没有。
相反,如果你不需要OO设计,并且仍然只是为了它而强加它,那将是一种耻辱。

  

基本上,我想在没有指针或重定向的情况下使用这个类...

事实上,你正朝着正确的方向前进。使用指针,数组和这种低级功能更适合于高级编程。请改用std::shared_ptrstd::vector和标准库容器。

答案 3 :(得分:1)

基本上,你使用没有多态的继承。那没关系。

面向对象编程具有除多态之外的其他特性。如果您可以从中受益,请使用它们。

答案 4 :(得分:1)

通常,将继承用于重用代码并不是一个好主意。继承是由设计用于使用基类的代码使用。我建议采用不同的方法解决问题。考虑一些替代方案,例如组合,更改要在自由函数而不是基类中实现的功能,或静态多态(通过使用模板)。

答案 5 :(得分:0)

It's not a performance problem until you can prove it

查看答案和“最快的代表”文章。