本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:C++11 – override关键字简要介绍
原文链接:https://www.stubbornhuang.com/930/
发布于:2020年10月12日 17:06:51
修改于:2020年10月31日 16:42:50

C++11 中的 override 关键字,可以显式的在派生类中声明,基类的哪些函数需要被重写,如果没被重写,则编译器会报错。防止出现在需要调用派生类某个成员函数的情况下错误的调用了基类的缺省函数实现。
1 派生类对基类中的函数继承
派生类对基类中的函数继承可以分为几种类型:
- 接口继承,通过在基类中声明纯虚函数实现
- 接口+缺省实现,通过在基类中声明普通虚函数实现,派生类可以声明同名的虚函数覆盖基类中的缺省实现,以实现自己的个性化
- 接口+强制实现,通过在基类中声明一个非虚函数实现
1.1 接口继承通常用不到override关键字
因为如果基类中声明了一个接口纯虚函数,那么派生类必须在类中对该纯虚函数进行实现
代码示例:
#include <iostream>
#include <memory>
using namespace std;
class Shape
{
public:
virtual void Draw() = 0;
};
class Triangle : public Shape
{
public:
virtual void Draw()
{
std::cout << "Triangle Draw" << std::endl;
}
};
int main()
{
std::shared_ptr<Triangle> pTriangle = std::make_shared<Triangle>();
pTriangle->Draw();
getchar();
return 0;
}
1.2 接口+强制实现通常用不到override关键字
因为基类中声明了一个成员函数,如果派生类中没有声明该成员函数,那么当调用该成员函数时,派生类会直接使用基类函数实现,但是如果在派生类中也对该成员函数进行了声明,那么当调用该成员函数时,派生类会直接调用自己的函数实现。
代码示例:
当Triangle类中没有实现Length方法时,则会调用Shape的Length方法
#include <iostream>
#include <memory>
using namespace std;
class Shape
{
public:
virtual void Draw() = 0;
void Length()
{
std::cout << "Shape Length" << std::endl;
}
};
class Triangle : public Shape
{
public:
virtual void Draw()
{
std::cout << "Triangle Draw" << std::endl;
}
};
int main()
{
std::shared_ptr<Triangle> pTriangle = std::make_shared<Triangle>();
pTriangle->Draw();
pTriangle->Length();
getchar();
return 0;
}
输出:
Triangle Draw
Shape Length
当Triangle类中实现同名的Length方法时,则会调用Triangle的Length方法:
#include <iostream>
#include <memory>
using namespace std;
class Shape
{
public:
virtual void Draw() = 0;
void Length()
{
std::cout << "Shape Length" << std::endl;
}
};
class Triangle : public Shape
{
public:
virtual void Draw()
{
std::cout << "Triangle Draw" << std::endl;
}
void Length()
{
std::cout << "Triangle Length" << std::endl;
}
};
int main()
{
std::shared_ptr<Triangle> pTriangle = std::make_shared<Triangle>();
pTriangle->Draw();
pTriangle->Length();
getchar();
return 0;
}
输出:
Triangle Draw
Triangle Length
1.3 override关键字通常在派生类对基类普通虚函数的继承上使用
显式的定义必须在派生类中重新实现该函数,不使用基类的缺省函数实现,如果派生类没有重写该函数实现,则编译器会报错,从编译层面防止代码逻辑出错。
代码示例:
在下面代码中,我们在基类Shape中声明了一个普通虚函数Area用于计算图形的面积,但是由于某些原因我们忘记在派生类Triangle中进行覆盖重写该函数实现,以输出Triangle类的面积,那么此时我们后续时刻调用Triangle类的Area方法,那么会调用基类Shape的Area方法。
#include <iostream>
#include <memory>
using namespace std;
class Shape
{
public:
virtual void Area()
{
std::cout << "Shape Area" << std::endl;
}
};
class Triangle : public Shape
{
public:
};
int main()
{
std::shared_ptr<Triangle> pTriangle = std::make_shared<Triangle>();
pTriangle->Area();
getchar();
return 0;
}
为了防止这种错误,我们通常会在Triangle类方法声明中使用override关键字,以确保从编译层面就避免在Triangle类中没有重写Area方法,
代码示例:
#include <iostream>
#include <memory>
using namespace std;
class Shape
{
public:
virtual void Area()
{
std::cout << "Shape Area" << std::endl;
}
};
class Triangle : public Shape
{
public:
virtual void Area() override;
};
int main()
{
std::shared_ptr<Triangle> pTriangle = std::make_shared<Triangle>();
pTriangle->Area();
getchar();
return 0;
}
该代码在编译阶段会出现以下错误:
正确的代码实现为:
#include <iostream>
#include <memory>
using namespace std;
class Shape
{
public:
virtual void Area()
{
std::cout << "Shape Area" << std::endl;
}
};
class Triangle : public Shape
{
public:
virtual void Area() override
{
std::cout << "Triangle Area" << std::endl;
}
};
int main()
{
std::shared_ptr<Triangle> pTriangle = std::make_shared<Triangle>();
pTriangle->Area();
getchar();
return 0;
}
2 结论
- 基类中使用纯虚函数,则派生类则是从基类继承接口,并且必须在类中对该接口进行实现
- 基类中使用普通虚函数,则派生类是从基类继承接口和缺省实现,如果派生类重写该接口,则使用派生类的实现,如果没有,则使用基类的缺省实现,而override常使用在此情况中,最好建议在派生类中需要重写的函数声明之后增加关键字override,避免出现逻辑错误
- 基类中使用普通函数,则派生类是从基类继承接口和强制实现,不建议修改继承自基类的非虚函数
当前分类随机文章推荐
- C++ - std::map正向遍历与反向遍历的几种方式 阅读4165次,点赞3次
- C++ - 在两个互有依赖关系的类中使用std::shared_ptr和std::weak_ptr进行内存管理 阅读604次,点赞0次
- C++11/std::condition_variable - 生产者消费者模型 阅读2729次,点赞0次
- C++ – 字节数组byte[]或者unsigned char[]与bool的相互转换 阅读873次,点赞1次
- C++ - 最简单的将文本文件的内容一次性读取到std::string的方法 阅读4561次,点赞4次
- C++11/std::thread - 线程管理join/detach 阅读2256次,点赞0次
- C++ - GBK编码下的全角字符转半角字符 阅读1497次,点赞0次
- C++ - 在CTC解码算法后移除相邻重复和blank索引 阅读286次,点赞0次
- C++11 - 解析并获取可变参数模板中的所有参数 阅读1150次,点赞0次
- C++ - 拷贝构造函数与拷贝构造函数调用时机 阅读268次,点赞0次
全站随机文章推荐
- 资源分享 - Vector Analysis for Computer Graphics , Second Edition 英文高清PDF下载 阅读975次,点赞0次
- TensorRT - Polygraphy工具的使用 阅读4206次,点赞0次
- C++ - 在两个互有依赖关系的类中使用std::shared_ptr和std::weak_ptr进行内存管理 阅读604次,点赞0次
- 资源分享 - Ray Tracing Gems - High-Quality and Real-Time Rendering with DXR and Other APIs 英文高清PDF下载 阅读2542次,点赞0次
- 人工智能 - YOLO v3,YOLO v4,YOLO v5等版本演变史 阅读1365次,点赞0次
- Duilib - 在主界面xml描述文件中使用ChildLayout或者Include嵌入子界面xml描述文件 阅读481次,点赞0次
- TensortRT - 转换模型出现Could not locate zlibwapi.dll. Please make sure it is in your library path!错误 阅读456次,点赞0次
- 深度学习 - CNN中卷积层、池化层、全连接层的输出参数大小的计算 阅读610次,点赞1次
- FFmpeg - 将某个文件夹下的图片按标号顺序合成为指定编码格式和指定帧率的视频 阅读4150次,点赞0次
- 资源分享 - Fundamentals of Computer Graphics, Fourth Edition高清英文PDF下载 阅读12465次,点赞8次
评论
168