c++ - 覆盖 C++ 纯虚函数
问题描述
我有以下课程:
模式类 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;
}
以下是我的问题:
关键字“覆盖”是否总是必要的?如果没有,最佳实践是什么?
主要问题: 我知道上面的代码对我有用。但是我有一个问题,我基本上必须将纯虚函数的函数签名从基类“复制”到派生类中。如果我不知道基类有哪些纯虚函数,会发生什么?
我上面的实现意味着我必须知道基类中所有可用的纯虚函数。我尝试通过 Mode::scope 和 LocalMode::scope 访问纯虚函数,但在 Visual Studio 中我只是收到了一些错误消息(我认为这些错误消息与这个问题无关)。
一些插件/智能感知? 我记得在 java IntelliSense 中通常帮助我并从抽象类中添加了所需的函数。尽管我知道 java 在这个意义上(从抽象类继承)与 c++ 有点不同,但我还想知道是否有任何工具可以帮助我自动包含这些工具?
浏览互联网我找不到任何例子。他们都假设,基类的所有纯虚函数都是已知的……我只是在想象,如果我有一个带有很多纯虚函数的抽象类,而我忘记复制其中一个,在实例化时我会出错...
先感谢您。
解决方案
关键字“覆盖”是否总是必要的?如果没有,最佳实践是什么?
它从来不是“必要的”。无论是否使用此关键字,覆盖都有效。它只是在这里帮助您防止诸如拼写错误等问题。
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
在要覆盖虚函数时始终使用关键字。
主要问题:我知道上面的代码对我有用。但是我有一个问题,我基本上必须将纯虚函数的函数签名从基类“复制”到派生类中。如果我不知道基类有哪些纯虚函数,会发生什么?
你不能不知道。要从类派生,编译器需要该类的完整定义,这通常意味着您拥有#include
它(并且您可以访问该定义)。
我上面的实现意味着我必须知道基类中所有可用的纯虚函数。我尝试通过 Mode::scope 和 LocalMode::scope 访问纯虚函数,但在 Visual Studio 中我只是收到了一些错误消息(我认为这些错误消息与这个问题无关)。
您在寻找反射机制吗?它在 C++ 中不存在,因此您无法获取给定类的函数列表。如果你想从另一个函数调用纯虚函数,那是行不通的,因为它们是纯虚函数。
一些插件/智能感知?
这对于 StackOverflow 来说显然是题外话,但是 C++ 的 IDE 有很多,找到它们应该没有任何问题。
推荐阅读
- ios - 如何为 MPNowPlayingInfoCenter 设置艺术品图像
- cron - 安排 Airflow Dag 运行以具有准确的时间而不是 cron
- r - 填充格式为 POSIXct 的两个事件时间戳之间的日期
- oauth-2.0 - 获取无效的授权代码,错误 AADSTS70000:为“代码”参数提供的值无效。代码已过期
- c++ - Visual Studio C++ 参考删除函数编译错误
- java - 如何将数据从 Java 服务批量插入 Google BigQuery?
- python - Django UserCreationForm 未提交
- python-3.x - pyspark 数据框:为什么我可以选择一些嵌套字段而不选择其他字段?
- jquery - Jquery星级评分如何在鼠标悬停和Cencel上添加
- typescript - 使用 import 而不是 require 和 typeof