For what purpose non-virtual method will be used with C++?
使用C++的功能性使用非虚拟方法的目的是什么?通过对象句柄而不是对象类型来更改对象的方法有什么好处吗?我找到了许多关于如何使用虚拟方法的文章,但我找不到如何使用非虚拟方法。我所知道的其他语言,如Java、Ruby和Python只有虚拟方法。因此,功能上的非虚拟方法是不需要的,只是为了性能的原因而使用?
好啊。我没有读过标有"的副本"的文章。但是你的答案对我来说还是很有价值的,它讲述了C++的起源和比较C++和其他面向对象语言。谢谢大家的回答。
型
答案很简单:因为C++不是Java。
编程语言有不同的哲学和实现相同结果的不同方法。
Java(以及其他"OO-Load",即"每个对象都是-GCED和IS-A"类型),鼓励您以非常具体的方式思考对象:继承和聚合是实现代码的灵活性和泛化的主要方式。对象几乎总是引用类型,这意味着
C++是不同的。对象的概念可能是语言的核心,但对象基本上是数据和功能的单元。它是"真正的"OOP语言对象的更精简的形式,通常分配在堆栈上,使用RAII处理自己的资源,并且是一种值类型。
遗传和多态性存在,但它们不如组成和编译时多态性(模板)。
C++不鼓励你把对象看作是引用类型。对象可能是引用类型,它们可能具有虚拟函数,但这只是在C++中实现灵活性和泛化的一种方式,而不是Java。您可以使用模板代替,函数指针和不透明类型(ALA-C风格多态性),继承+重写函数(A-LA Java风格),因此,C++不强制您将Java路由转换为灵活性——它给了您选择完成事情的最佳方式的机会。
型
C++方法查找机制不允许多态性,如果它是非虚的。将类定义为非虚拟类将避免开销和混淆。
看看这个问题和答案
型
当将一个方法标记为
由于C++的很大一部分是给程序员选择他想要做的,如果你想要静态的动态链接,你可以选择。
型
非虚拟方法可以添加仅特定于派生类的其他功能。
1 2 3 4 5 6 7 8 9 10 | 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 }; |
型
如果一个方法不是虚拟的,编译器知道内存中这个方法的代码将在编译时位于何处的地址,并且可以立即使用它。如果一个方法是虚拟的,那么它必须在运行时确定,应该根据对象类型调用哪个实现。每次通话都会增加开销。因此,通过使一个方法非虚拟化,您可以使它更有效。
应该提到的是,在某些语言中,它是相反的:默认情况下,方法是"虚拟的",但是您可以显式地将它们标记为"非虚拟的"(通常称为