出于什么目的,非虚拟方法将与C++一起使用?

For what purpose non-virtual method will be used with C++?

本文关键字:方法 C++ 一起 虚拟 于什么 什么      更新时间:2023-10-16

就C++的功能而言,使用非虚拟方法的目的是什么?通过对象句柄而不是对象类型更改对象的方法有什么优点吗?我找到了很多关于如何使用虚拟方法的文章,但我找不到如何使用非虚拟方法。 我知道的其他语言,如Java,Ruby和Python只有虚拟方法。所以功能上不需要非虚拟方法,只是出于性能原因?

还行。我没有读过标记为重复的文章。但是你的回答对我来说仍然很有价值,因为它讲述了C++的起源,并将C++与其他面向对象的语言进行比较。谢谢大家的回答。

答案很简单:因为C++不是Java。

编程语言有不同的理念和不同的方法来实现相同的结果。

Java(以及其他"OOP-language-where-every-object-is-ged-and-is-a-reference-type",如C#(鼓励你以非常具体的方式思考对象:继承和Polymoprphism是实现代码灵活性和泛化的主要方法。对象几乎总是引用类型,这意味着Car car实际上可以指向ToyotaFord等等。对象被混杂收集和动态分配。无论如何,所有对象都继承自Object类,因此继承和动态多态性无论如何都通过语言设计注入到语言对象中。

C++是不同的。 对象的概念可能是语言的核心,但对象基本上是数据和功能的单元。 它是"真正的"OOP 语言对象的精简形式,通常在堆栈上分配,使用 RAII 来处理自己的资源,并且是一种值类型。

继承和多态性存在,但它们不如组合和编译时多态性(模板(。

C++不鼓励您将对象视为引用类型。 对象可能是引用类型,它们可能具有虚函数,但与 Java 相比,这只是在 C++ 中实现灵活性和泛化的一种方式。 你可以改用模板, 函数指针和不透明类型(a-la C 样式多态性(, 继承 + 覆盖函数(a-la Java 风格(, 因此,C++不会强迫您采用 Java 途径来实现灵活性 - 它让您有机会选择完成事情的最佳方式。

当将一个方法标记为virtual时,每次调用这样的方法时,程序都必须检查你调用该方法的对象内部的虚拟表,这称为动态调度。与使用静态调度解决的正常方法相比,它会产生一些开销。

由于C++的很大一部分是让程序员选择他想做什么,你可以选择是否想要静态的动态链接。

C++方法查找机制如果它是非虚拟的,则不允许多态性。将类定义为非虚拟类将防止开销和混淆。

看看这个问题和答案

如果方法不是虚拟的,编译器知道此方法的代码在编译时将位于内存中的地址,并且可以立即使用它。如果某个方法是虚拟的,则必须在运行时根据对象类型确定应调用哪个实现。它增加了每次调用的开销。因此,通过使方法非虚拟,您可以使其更有效率。

应该提到的是,在某些语言中,情况正好相反:默认情况下,这些方法是"虚拟的",但您可以明确地将它们标记为"非虚拟"(通常称为final(。

非虚拟方法可以添加特定于派生类的其他功能。

class animal {
public:
virtual string name() = 0;
};
class rhino :public animal {
public:
string name() override { return "Rhino"; }
int getHornSize() { return 10; }  // non-virtual method add functionality only specific to rhino class
};