为了账号安全,请及时绑定邮箱和手机立即绑定

派生类中函数的C+“虚拟”关键字。有必要吗?

派生类中函数的C+“虚拟”关键字。有必要吗?

C++
当年话下 2019-07-27 15:15:18
派生类中函数的C+“虚拟”关键字。有必要吗?用下面的结构定义.。struct A {     virtual void hello() = 0;};方法1:struct B : public A {     virtual void hello() { ... }};方法2:struct B : public A {     void hello() { ... }};这两种重写hello函数的方法有什么区别吗?
查看完整描述

3 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

他们完全一样。除了第一种方法需要更多的输入,而且可能更清晰之外,它们之间没有什么区别。



查看完整回答
反对 回复 2019-07-28
?
Qyouu

TA贡献1786条经验 获得超11个赞

函数的“虚拟性”是隐式传播的,但是,如果virtual关键字没有显式使用,所以您可能希望使用它,如果只是为了使编译器保持安静。

从纯粹的文体角度来看,包括virtual关键字清楚地向用户‘宣传’这个功能是虚拟的。这对任何进一步细分B级的人来说都是很重要的,而不必检查A的定义。对于深度类层次结构而言,这一点尤为重要。



查看完整回答
反对 回复 2019-07-28
?
慕神8447489

TA贡献1780条经验 获得超1个赞

不,virtual派生类的虚拟函数重写不需要关键字。但值得一提的是一个相关的缺陷:无法覆盖虚拟函数。

这个未能覆盖如果您打算覆盖派生类中的虚拟函数,但在签名中出错,使其声明一个新的和不同的虚拟函数,则发生。此函数可能是过载基类函数,或者它的名称可能不同。是否使用virtual关键字在派生类函数声明中,编译器将无法判断您打算重写基类中的函数。

然而,这个陷阱却被C+11解决了。显式覆盖语言特性,它允许源代码明确指定成员函数用于覆盖基类函数:

struct Base {
    virtual void some_func(float);};struct Derived : Base {
    virtual void some_func(int) override; // ill-formed - doesn't override a base class method};

编译器将发出编译时错误,编程错误将立即明显(也许派生中的函数应该使用float作为论据)。

请参阅WP:C+11.




查看完整回答
反对 回复 2019-07-28
  • 3 回答
  • 0 关注
  • 312 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信