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

C++ : inheritance without virtuality

本文关键字:继承 虚拟性 C++      更新时间:2023-10-16

我想知道我目前所做的对C++来说是否是一种耻辱,或者它是否还可以。

我出于计算目的编写代码。对于某些类,我使用具有虚拟/多态性的正常继承方案。但是我需要一些类来执行密集计算,并且由于虚拟性而避免开销会很棒。

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

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

谢谢。

在C++中使用多态性既不好也不坏。 多态性是有目的的,缺乏多态性也是有目的的。 使用继承而不使用多态性本身并没有错。

由于多态性是有目的的,

而缺少多态性也是有目的的,因此在设计类时应牢记这些目的。 例如,如果需要将行为运行时绑定到类实例,则需要多态性。

话虽如此,选择一种方法而不是另一种方法有正确和错误的理由。 如果你在设计没有多态性的类时,纯粹是因为你想"避免开销",这可能是一个错误的原因。 这是一个过早优化的例子,只要你在没有分析代码并证明多态性是一个实际问题的情况下进行设计更改或决策。

首先根据架构要求进行设计。 稍后返回并重构,如果设计被证明是非性能的。

我会改写这个问题:

如果你避免多态性,遗传会带来什么组合无法实现?

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

不使用virtual成员/继承是完全可以的。C++旨在娱乐广大观众,它不限制任何人的特定范式。

您可以使用C++对过程、泛型、面向对象或它们的任意组合进行编码。只是尝试充分利用它。

我目前正在做的对C++来说是一种耻辱,或者如果没问题。

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

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

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

基本上,您使用的是没有多态性的继承。没关系。

面向对象编程具有多态性以外的其他功能。如果你能从中受益,就使用它们。

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

在你能证明它之前,这不是一个性能问题。

查看该答案和"最快的代表"文章。