c++ - 如何添加最终覆盖
问题描述
如何添加“最终覆盖”来解决此问题?
#include <iostream>
struct Shape
{
virtual void print()
{
std::cout << "SHAPE" << std::endl;
}
virtual ~Shape() {}
};
struct Box : public virtual Shape
{
void print()
{
std::cout << "BOX" << std::endl;
}
};
struct Sphere : public virtual Shape
{
void print() final override
{
std::cout << "SPHERE" << std::endl;
}
};
struct GeoDisc : public Box, public Sphere
{
};
int main(int argc, char** argv)
{
Shape* s = new GeoDisc;
s->print();
delete s;
return 0;
}
这是错误消息:
31:8:错误:'GeoDisc' 中的 'virtual void Shape::print()' 没有唯一的最终覆盖
解决方案
虚拟方法声明中的关键字final
防止多重继承,所以如果我试图在这种情况下解决歧义,这是一种错误的方法。如果 Box 和 Sphere 都有最终决定,您将收到错误消息“虚拟函数 'Shape::print' 在 'GeoDisc' 中有多个最终覆盖器”。法律上的歧义解决方案是:
struct Sphere : public virtual Shape
{
void print() override
{
std::cout << "SPHERE" << std::endl;
}
};
struct GeoDisc : public Box, public Sphere
{
void print() final override
{
Sphere::print();
}
};
推荐阅读
- node.js - 为什么我使用 Node 核心模块“fs”得到一个 NOENT
- python - 使用两个数据框并排绘制条形图
- javascript - 使用 setInterval 随时间递增减少变量
- python - 在python中更新嵌套数据结构的节点
- c++ - 如何从类的私有构造函数访问类的私有成员
- r - R / R studio中多个时间段的一阶差分
- apache-spark - Spark Clustered By/Bucket by dataset 不使用内存
- matlab - Matlab中的“填充”功能
- react-native - React-navigation 3 中的 createBottomTabNavigator ,不起作用
- vue.js - 以编程方式设置 v-select 值不会在 vuetify 中触发 @change