当前位置: 首页 > 知识库问答 >
问题:

子类虚函数中关键字override有什么用?[重复]

邵鸿福
2023-03-14

未解决原始关闭原因

关键字虚拟允许派生类在需要多态的情况下覆盖,这可以在有或没有关键字覆盖的情况下关闭。添加覆盖如何影响程序?

示例代码:

#include <iostream>
using namespace std;

class Base {
public:
    void Print() {who();}
    virtual void who() { cout << "I am Base\n"; }
};
class Derived_A : public Base {
public:
    void who() { cout << "I am Derived_A\n"; }
};
class Derived_B : public Base {
public:
    virtual void who() override { cout << "I am Derived_B\n"; }
};

int main()
{
    Base b;
    b.Print(); //-> return "I am Base"

    Base* ptr = new Derived_A();
    ptr->Print(); // was expecting "I am Base" instead returns "I am Derived_A"

    Base* ptr1 = new Derived_B();
    ptr1->Print(); // expecting "I am Derived_B" and surely returns "I am Derived_B"

    return 0;
}

共有1个答案

夏侯腾
2023-03-14

向成员函数添加< code>override不会以任何方式改变程序的工作方式。你只需告诉编译器你想重写一个基类函数,如果你犯了一个错误,你会得到一个编译错误,以为你在重写一个函数,而实际上你没有。

例子:

class Base {
public:
    virtual void foo(int) {}
};

class Derived : public Base {
public:
    void foo(double) override {} // compilation error
};
 类似资料:
  • C 11添加了<code>override</code>,以确保您编写的打算重写基类虚拟函数的成员函数实际执行(或不会编译)。 但在大型对象层次结构中,有时您可能会意外地编写一个成员函数,该函数在您不打算的情况下重写基类virtual!例如: 有没有某种编译器标志/扩展至少会在< code>C::foo上发出警告?为了可读性和正确性,我只想强制所有的覆盖都使用< code>override。

  • 未解决原始关闭原因 我是一个C语言初学者。我遇到过在我正在处理的头文件中使用的< code>override关键字。我可以知道,什么是真正使用< code>override,也许用一个例子就容易理解了。

  • 公共类JavaApplication1{ } 在这里,JavaApp1不是子类,它包含一个超级关键字,那么它意味着什么呢?

  • 问题内容: 今天的工作中,我遇到了volatileJava中的关键字。不太熟悉,我找到了这种解释。 鉴于该文章详细解释了所讨论的关键字,您是否曾经使用过它,或者是否曾见过可以正确使用此关键字的情况? 问题答案: volatile具有内存可见性的语义。基本上,volatile字段的值对所有读取器(尤其是其他线程)可见,在该字段上完成写操作之后。没有volatile,读者可能会看到一些未更新的值。 要

  • 给定下面的代码片段,函数调用有什么不同?什么是函数隐藏?什么是函数覆盖?它们与函数重载有什么关系?两者有什么区别?我在一个地方找不到关于这些的很好的描述,所以我在这里询问,这样我可以整合信息。

  • 这个关键参数是什么?为什么要传递类别小部件类的父类(我想是StatelessWidget)? 我看过重点班,但我什么都不懂。这一页没有上下文,也没有我可以使用的例子。