为什么使用虚函数而不是常规函数

Why use virtual function instead of regular?

本文关键字:函数 常规 为什么      更新时间:2023-10-16

在 c++ 中,基类中的虚函数可以在派生类中被覆盖。以及一个成员函数,其中特定的实现将取决于运行时调用它的对象的类型。

由于必须实现虚函数(纯虚函数除外)我可以在基类中使用常规函数并在派生类中重新定义它吗?如果是。使用虚函数有什么意义?

谢谢

您可以重新定义它,但它不会以多态方式工作。

所以如果我有一个

class base
{
   int foo(){ return 3; }
};
class Der : public base
{
  int foo() {return 5;}
};

然后有一个取基数的函数

void dostuff(base &b)
{
   b.foo(); // This will call base.foo and return 3 no matter what
}

我这样称呼它

Der D; 
dostuff(D); 

现在,如果我将底座更改为

class base
{
   virtual int foo(){ return 3; }
};
void dostuff(base &b)
{
   b.foo(); // This will call the most derived version of foo 
            //which in this case will return 5
}

所以真正的答案是,如果你想编写通用代码,从基础调用正确的函数,它必须是虚拟的。

实际上,虚函数是面向对象语言的基础。在 java 中,所有函数都是虚函数。但在 c++ 中,虚函数比常规函数慢。因此,如果不需要函数覆盖,则应使用常规函数而不是虚拟函数。