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

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

用下面的结构定义.。

struct A {
    virtual void hello() = 0;};

方法1:

struct B : public A {
    virtual void hello() { ... }};

方法2:

struct B : public A {
    void hello() { ... }};

这两种重写hello函数的方法有什么区别吗?



当年话下
浏览 313回答 3
3回答

白猪掌柜的

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

Qyouu

函数的“虚拟性”是隐式传播的,但是,如果virtual关键字没有显式使用,所以您可能希望使用它,如果只是为了使编译器保持安静。从纯粹的文体角度来看,包括virtual关键字清楚地向用户‘宣传’这个功能是虚拟的。这对任何进一步细分B级的人来说都是很重要的,而不必检查A的定义。对于深度类层次结构而言,这一点尤为重要。

慕神8447489

不,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.
打开App,查看更多内容
随时随地看视频慕课网APP