我们可以向继承的虚拟成员函数添加一个常量吗

Can we add a const to an inherited virtual member function

我正在学习 C++ 中的继承。因此,为了消除我的疑虑,我正在尝试不同的例子。下面给出了一个我不理解的例子:

struct Base 
{
  virtual void func(int a)
  {
      std::cout<<"base version called"<<std::endl;
  }
};
struct Derived: Base 
{
  void func(int a) const  //note the const here: Is this a new function or this function overrides the old virtual from base
  {
     std::cout<<"derived version called"<<std::endl;
  }
};

请注意,我在结构 Derived 中为 func 成员函数添加了 const。我的问题是:这个成员函数 funcDerive 里面是一个新的(与 Base 里面的 func 分开)函数还是这个 funcDerived 中覆盖旧虚拟 func 来自 Base?

PS:我的问题 不是 关于 const 的含义,因为我知道在这种情况下它的意思是 const成员函数,这意味着 this 指针指向的对象被视为 const 对象。我的问题是 Derived 里面的 funcBase.

里面的函数是否不同

Derived里面的成员函数func是separate/differentnon-virtual成员函数,来自 virtual func inside Base,如下所述。

说明

您可以确认这一点:

  1. 通过在 Derived 中的 funcconst 之后添加说明符 override,如图所示 here 您将看到错误提示
marked override, but does not override

这确认 Derived 中的 func 不会覆盖 Base 中的虚拟 func

struct Derived: Base
{
  void func(int a) const override //added keyword override. This gives error now
  {
     std::cout<<"derived version called"<<std::endl;
  }
};
  1. 此外,通过在 Derivedfuncconst 之后添加说明符 final,如图 here 所示,您将看到错误提示
marked final, but is not virtual

这确认 Derived 中的 func 是一个 non-virtual 成员函数。

struct Derived: Base
{
  void func(int a) const final //added keyword final. This gives error now
  {
     std::cout<<"derived version called"<<std::endl;
  }
};

结合这两点,我们得出的结论是Derived里面的func是一个non-virtual成员函数,它与Base.

中的 virtual 成员函数 func

我们说属于Derivedfunc隐藏了Base中的虚拟func。如此有效,Derived 有两个名为 func 的函数。一个是它从 Base 继承的,它是 隐式虚拟的 ,第二个是它定义的是非虚拟的。


另请注意,还有另一种方法可以确认 Derived 中的 func 是一个非虚拟成员函数,只需声明它而不是像 here 所示那样定义它,因为我们必须定义一个虚拟成员函数。另一方面,如果成员函数是非虚拟的,只要我们不调用该成员函数,我们就可以拥有它的声明而没有它的定义。

struct Derived: Base
{
  void func(int a) const; //note this is a declaration and not a definition. This works as long as you do not call this function. You cannot do this with a virtual member function
 
};

void func(int a) const inside Derived 是一个不同的成员函数。一旦声明了一个函数const,另一个函数就诞生了。