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

非虚拟方法将用于C++;? 在使用C++的功能方面,使用非虚拟方法的目的是什么?通过对象句柄而不是对象类型更改对象的方法有什么好处吗?我找到了很多关于如何使用虚拟方法的文章,但我找不到如何使用非虚拟方法。 我所知道的其他语言,如Java、Ruby和Python,只有虚拟方法。所以功能上的非虚拟方法是不需要的,只是为了性能的原因而使用,c++,C++,嗯。我没有读那篇标有“复制品”的文章。但是,你的答案仍然对我有价值,从讲述C++的起源和比较C++到其他面向对象语言。谢谢大家的回答。如果一个方法不是虚拟的,编译器在编译时就知道该方法代码在内存中的位置,并且可以立即使用它。如果方法是虚拟的,则必须在运行时根据对象类型确定该方法,并调用哪个实现。这会增加每次通话的开销。因此,通过使方法非虚拟化,您可以使其更高效 应该提到的是,在某些语言中,情况正好相反:默认情况下,方法是“虚拟的”,但您可以显式地将它们标记为“非虚拟的”(通常称为final)。如

嗯。我没有读那篇标有“复制品”的文章。但是,你的答案仍然对我有价值,从讲述C++的起源和比较C++到其他面向对象语言。谢谢大家的回答。

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


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

如果一个方法不是虚拟的,编译器在编译时就知道该方法代码在内存中的地址,而且可以马上使用。如果方法是虚拟的,则必须在运行时根据对象类型确定该方法,并调用哪个实现。这会增加每次通话的开销。因此,通过使方法非虚拟化,您可以使其更高效


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

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


C++中的很大一部分是给程序员选择他想要做的,如果你想要静态链接,你可以选择。

< P>当把一个方法标记为“代码>虚拟< /代码>时,每次调用这种方法时,程序都必须检查你正在调用方法的对象中的虚拟表,这叫做动态调度。与使用静态分派解决的常规方法相比,它会产生一些开销


< C++ > C++的大部分内容是给程序员选择他想要做的,如果你想要静态链接,你可以选择。将类定义为非虚拟类将防止开销和混乱


看看

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


看看

非虚拟方法可以添加仅特定于派生类的附加功能

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

非虚拟方法可以添加仅特定于派生类的附加功能

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

<> >答案很简单:因为C++不是java。 编程语言有不同的理念和不同的方法来实现相同的结果

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

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

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


C++不鼓励您将对象视为引用类型。对象<强> > < >强>是引用类型,它们<强> > 具有虚拟函数,但这只是实现C++中灵活性和泛化的一种方式,而不是java。你可以使用模板,而不是函数指针和不透明类型(ALA-C风格多态),继承+重写函数(A-LA java风格),因此C++不强迫你把java路径变成灵活性——它给你机会来选择完成事情的最佳方式。P> > P> >答案很简单:因为C++不是java。p> 编程语言有不同的理念和不同的方法来实现相同的结果

Java(以及其他“OOP-language-where-every-object-is-GCed-and-is-a-reference-type”,如C#)鼓励您以非常具体的方式思考对象:继承和多形性是实现代码灵活性和泛化的主要方式。对象几乎总是引用类型,这意味着
Car-Car
实际上可以指向
Toyota
Ford
等等。对象被收集并动态分配。所有对象都继承自
对象
类,因此继承和动态多态性是一个非常重要的问题