在派生 class 中添加虚拟说明符
Adding virtual specifier in a derived class
考虑以下代码:
struct virtualfoo
{
virtualfoo{};
virtual ~virtualfoo{};
virtual double doStuff() = 0
};
struct realbar : virtualfoo
{
realbar{};
virtual ~realbar{};
virtual double doStuff();
};
因为我想为 realbar
实现 doStuff()
,虚拟不是强制性的。但如果我做对了,在 realbar::doStuff()
旁边添加虚拟说明符不会有什么坏处,对吗?
using/not 使用虚拟会产生什么副作用?
您是否显式声明 realbar::doStuff
为虚拟并不重要,因为由于 virtualfoo:doStuff
是虚拟的,它隐含地 virtual
。所以没有副作用; realbar::doStuff
无论如何都会是虚拟的。例如,赋予这个 online C++ draft standard:
10.3 Virtual functions
(2) If a virtual member function vf is declared in a class Base and in
a class Derived, derived directly or indirectly from Base, a member
function vf with the same name, parameter-type-list (8.3.5),
cv-qualification, and ref- qualifier (or absence of same) as Base::vf
is declared, then Derived::vf is also virtual (whether or not it is so
declared) and it overrides Base::vf. ...
派生的 class 中不需要 virtual 关键字。但是它使代码更清晰。同样在 C++11 中引入了 override
关键字,它允许源代码明确指定成员函数 打算 覆盖基本 class 方法。
使用关键字 override
编译器将检查基 class(es) 以查看是否存在具有此确切签名的虚函数。如果没有,编译器会报错。
考虑以下代码:
struct virtualfoo
{
virtualfoo{};
virtual ~virtualfoo{};
virtual double doStuff() = 0
};
struct realbar : virtualfoo
{
realbar{};
virtual ~realbar{};
virtual double doStuff();
};
因为我想为 realbar
实现 doStuff()
,虚拟不是强制性的。但如果我做对了,在 realbar::doStuff()
旁边添加虚拟说明符不会有什么坏处,对吗?
using/not 使用虚拟会产生什么副作用?
您是否显式声明 realbar::doStuff
为虚拟并不重要,因为由于 virtualfoo:doStuff
是虚拟的,它隐含地 virtual
。所以没有副作用; realbar::doStuff
无论如何都会是虚拟的。例如,赋予这个 online C++ draft standard:
10.3 Virtual functions
(2) If a virtual member function vf is declared in a class Base and in a class Derived, derived directly or indirectly from Base, a member function vf with the same name, parameter-type-list (8.3.5), cv-qualification, and ref- qualifier (or absence of same) as Base::vf is declared, then Derived::vf is also virtual (whether or not it is so declared) and it overrides Base::vf. ...
派生的 class 中不需要 virtual 关键字。但是它使代码更清晰。同样在 C++11 中引入了 override
关键字,它允许源代码明确指定成员函数 打算 覆盖基本 class 方法。
使用关键字 override
编译器将检查基 class(es) 以查看是否存在具有此确切签名的虚函数。如果没有,编译器会报错。