出于什么目的,非虚拟方法将与C++一起使用?
For what purpose non-virtual method will be used with C++?
就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
实际上可以指向Toyota
、Ford
等等。对象被混杂收集和动态分配。无论如何,所有对象都继承自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
};
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 初始化具有非默认构造函数的std::数组项的更好方法