为什么非虚拟方法将与C ++一起使用?


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"类型),鼓励您以非常具体的方式思考对象:继承和聚合是实现代码的灵活性和泛化的主要方式。对象几乎总是引用类型,这意味着Car car实际上可以指向ToyotaFord等。对象被收集并动态分配。所有对象都继承自一个Object类,因此继承和动态多态性无论如何都通过语言设计嵌入到语言对象中。

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

遗传和多态性存在,但它们不如组成和编译时多态性(模板)。

C++不鼓励你把对象看作是引用类型。对象可能是引用类型,它们可能具有虚拟函数,但这只是在C++中实现灵活性和泛化的一种方式,而不是Java。您可以使用模板代替,函数指针和不透明类型(ALA-C风格多态性),继承+重写函数(A-LA Java风格),因此,C++不强制您将Java路由转换为灵活性——它给了您选择完成事情的最佳方式的机会。


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

看看这个问题和答案


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

由于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
};

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

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