我们可以向继承的虚拟成员函数添加一个常量吗
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
。我的问题是:这个成员函数 func
在 Derive
里面是一个新的(与 Base
里面的 func
分开)函数还是这个 func
在 Derived
中覆盖旧虚拟 func
来自 Base
?
PS:我的问题 不是 关于 const
的含义,因为我知道在这种情况下它的意思是 const
成员函数,这意味着 this
指针指向的对象被视为 const
对象。我的问题是 Derived
里面的 func
和 Base
.
里面的函数是否不同
Derived
里面的成员函数func
是separate/differentnon-virtual成员函数,来自 virtual func
inside Base
,如下所述。
说明
您可以确认这一点:
- 通过在
Derived
中的 func
的 const
之后添加说明符 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;
}
};
- 此外,通过在
Derived
中 func
的 const
之后添加说明符 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
我们说属于Derived
的func
隐藏了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,另一个函数就诞生了。
我正在学习 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
。我的问题是:这个成员函数 func
在 Derive
里面是一个新的(与 Base
里面的 func
分开)函数还是这个 func
在 Derived
中覆盖旧虚拟 func
来自 Base
?
PS:我的问题 不是 关于 const
的含义,因为我知道在这种情况下它的意思是 const
成员函数,这意味着 this
指针指向的对象被视为 const
对象。我的问题是 Derived
里面的 func
和 Base
.
Derived
里面的成员函数func
是separate/differentnon-virtual成员函数,来自 virtual func
inside Base
,如下所述。
说明
您可以确认这一点:
- 通过在
Derived
中的func
的const
之后添加说明符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;
}
};
- 此外,通过在
Derived
中func
的const
之后添加说明符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
我们说属于Derived
的func
隐藏了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,另一个函数就诞生了。