【问题标题】:Overriding C++ pure virtual functions覆盖 C++ 纯虚函数
【发布时间】:2020-08-21 08:45:52
【问题描述】:

我有以下课程:

模式类 h 文件:

#pragma once

class Mode
{

public: 
    virtual int recv()  = 0;
};

模式类 cpp 文件: -> 空的

LocalMode 类 h 文件:

#pragma once
#include "Mode.h"

class LocalMode: public Mode
{
private: 

public: 
    LocalMode();
    int recv();

};

LocalMode 类 cpp 文件:

#include "LocalMode.h"

int LocalMode::recv(){
    return 0;
}

这是我的问题:

  1. 关键字“覆盖”是否总是必要的?如果没有,最佳做法是什么?

  2. 主要问题: 我知道上面的代码对我有用。但是我有一个问题,我基本上必须将纯虚函数的函数签名从基类“复制”到派生类中。如果我不知道基类有哪些纯虚函数,会发生什么?

    我上面的实现意味着我必须知道基类中所有可用的纯虚函数。 我尝试通过 Mode::scope 和 LocalMode::scope 访问纯虚函数,但在 Visual Studio 中我只是收到了一些错误消息(我认为这些错误消息与这个问题无关)。

  3. 一些插件/智能感知? 我记得在 java IntelliSense 中通常帮助我并从抽象类中添加了所需的函数。虽然我知道 java 在这个意义上(从抽象类继承)与 c++ 有点不同,但我还想知道是否有任何工具可以帮助我自动包含这些?

浏览互联网我找不到任何示例。他们都假设,基类的所有纯虚函数都是已知的...... 我只是在想象,如果我有一个带有很多纯虚函数的抽象类,而我忘记只复制其中一个,那么在实例化时我会得到一个错误......

提前谢谢你。

【问题讨论】:

  • 1. override 告诉编译器检查基类是否具有完全匹配的虚函数。所以,override 让编译器帮助你。 2. 如果你不知道基类,你就没有它的声明。 (否则,你可以看看它。)如果你没有decl。对于基类,您无法编译派生的。 (编译器也需要基类声明。)

标签: c++ inheritance abstract-class pure-virtual


【解决方案1】:

关键字“覆盖”是否总是必要的?如果没有,最佳做法是什么?

它从来都不是“必要的”。无论是否使用此关键字,覆盖都有效。它只是为了帮助您防止诸如拼写错误等问题。

struct A
{
    virtual int foo();
};

struct B: public A
{
    int fooo(); //whoops, not overriding, no compiler error
};

struct C: public A
{
    int fooo() override; //compiler error, compiler noticed my typo
};

因此,最佳做法是在您想要覆盖虚函数时始终使用 override 关键字。


主要问题:我知道上面的代码对我有用。但是我有一个问题,我基本上必须将纯虚函数的函数签名从基类“复制”到派生类中。如果我不知道基类有哪些纯虚函数,会发生什么?

你不可能不知道。要从类派生,编译器需要该类的完整定义,这通常意味着您拥有 #included 它(并且您可以访问该定义)。


我上面的实现意味着我必须知道基类中所有可用的纯虚函数。我尝试通过 Mode::scope 和 LocalMode::scope 访问纯虚函数,但在 Visual Studio 中我只是收到了一些错误消息(我认为这些错误消息与这个问题无关)。

您在寻找反射机制吗?它在 C++ 中不存在,所以你不能例如获取给定类的函数列表。如果你想从另一个函数调用纯虚函数,那是行不通的,因为它们是纯虚函数。


一些插件/智能感知?

那是 StackOverflow 的 explicitly off-topic,但是 C++ 的 IDE 有很多,你应该很容易找到它们。

【讨论】:

    猜你喜欢
    • 2014-05-22
    • 2013-10-04
    • 2021-09-30
    • 2013-01-16
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2014-03-08
    相关资源
    最近更新 更多