关于C++:为什么使用虚拟函数而不是正则函数?

Why use virtual function instead of regular?

本问题已经有最佳答案,请猛点这里访问。

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

因为必须实现虚函数(纯虚函数除外)我可以在基类中使用正则函数并在派生类中重新定义它吗?如果是的话。使用虚拟函数有什么意义?

谢谢


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

所以如果我有

1
2
3
4
5
6
7
8
9
class base
{
   int foo(){ return 3; }
};

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

然后有一个函数

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

我这样称呼它

1
2
Der D;
dostuff(D);

如果我把基地改成

1
2
3
4
5
6
7
8
9
10
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++中,虚函数比正则函数慢。因此,如果不需要函数重写,则应该使用常规函数而不是虚拟函数。