为什么 C++ 中 const 方法不覆盖非常量方法?

2023-11-29

考虑这个简单的程序:

class Shape
{
public:
    virtual double getArea() = 0;

};

class Rectangle : public Shape
{
    int width;
    int height;

public:
    Rectangle( int w , int h ) :width(w) , height(h) {}

    double getArea() const
    {
        return width * height;
    }
};


int main() {

    Rectangle* r = new Rectangle(4,2);
}

尝试编译这个问题给了我:

 'Rectangle' : cannot instantiate abstract class

为什么在 C++ 中不允许这样做,而协变返回类型是允许的?当然我可以通过以下方式修复程序Rectangle::getArea是一个非常量函数但我很好奇为什么语言设计者做出了不同的决定。

EDIT

很多人在他们的答案中提到了签名的不同之处。但也是如此

class Shape
{
public:
    virtual BaseArea* getArea() = 0;

};

class Rectangle : public Shape
{
public:
    virtual RectangleArea* getArea();
};

但是 C++ 不遗余力地允许这种情况发生,而 C# 却不允许这样做。

C++ 支持协变返回类型,因为如果我期望一个接口返回一个BaseArea*并且一个实现返回一个RectangleArea*,只要 RectangleArea 派生自 BaseArea 就可以了,因为我的合同得到了满足。

同样,提供非变异函数的实现不是满足仅要求变异函数的接口吗?


在这种情况下会发生什么:

struct base
{
    virtual void foo(); // May implement copy-on write
    virtual void foo() const;
};

struct derived : base
{
    // Only specialize the const version, the non const
    // default suits me well. How would I specify that I don't
    // want the non-const version to be overriden ?
    void foo() const;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 C++ 中 const 方法不覆盖非常量方法? 的相关文章

随机推荐

  • Vue.js - 同一路线上的两个不同组件

    我试图弄清楚如何使用 Vue 在同一条路线上拥有 2 个不同的组件 主页或登录页面 取决于用户是否经过身份验证 也许我在文档中遗漏了一些东西 但我无法也无法弄清楚 有可能吗 Thx 在路由器映射中使用 auth 参数 router map
  • Azure 数据工厂 V2 检查复制活动的文件大小

    我需要对本地数据源中的文件运行复制活动 我需要检查文件大小 如果大小大于 0 则复制它们 如果文件大小为 0 我将发送通知 以便管理员检查源 问题是 在 获取元数据 活动中 字段列表中的参数不包括大小 此外 验证活动也不查找大小属性 有什么
  • Spyder 4 绘图窗格不显示

    使用 Spyder 4 它不再在控制台上方显示 绘图 窗格 我已确保后端设置为内联 但窗格仍然不显示 如果有人知道任何解决方案 将不胜感激 Spyder 维护者在这里 您需要进入菜单View gt Panes并激活与绘图窗格相对应的条目
  • java中如何比较两个日期?

    我正在尝试比较两个日期 我只想比较日期部分而不是时间部分 这就是我在程序中存储日期的方式 Thu Jan 27 23 20 00 GMT 2011 我有一个 ArrayList
  • g++ 关于声明多维双精度数组的警告

    在我的 C 程序中 我试图初始化一个全为 0 的 double 类型的 3 3 3 数组 在类头文件中 我声明了一个成员 double list 3 3 3 当我打印出这个数组的内容时 我发现并非所有条目都如我所料为0 例如list 1 1
  • Mkmapview 半页卷曲[重复]

    这个问题在这里已经有答案了 可能的重复 如何在iPhone中制作像地图应用程序一样的半卷曲动画 我需要在地图视图中实现半页卷曲 就像 Google 地图应用程序一样 我实施UIViewAnimationTransitionCurlUp UI
  • 如何获取phonegap中的当前位置?

    我在我的应用程序中添加了地理定位插件 并使用此代码来获取phonegap中的当前位置 但这段代码不起作用 document addEventListener deviceready onDeviceReady false function
  • 如何使用 Perl 正则表达式删除未使用的嵌套 HTML span 标记?

    我正在尝试从 HTML 文件中删除未使用的跨度 即那些没有属性的跨度 并且已经用其他正则表达式清理了我不需要的所有属性 我的正则表达式有问题 没有选择要删除的正确的开始和结束标签对 my a a span b span style colo
  • 在 if 语句中使用 stringstream >> 运算符

    以下代码片段旨在尝试使用 stringstream 对象从字符串中提取整数 并检测整数提取是否成功 stringstream 类继承 gt gt 运算符以返回对 istream 实例的引用 整数提取失败如何导致 myStream 等于 0
  • GoogleAppEngineLauncher:数据库磁盘映像格式错误

    我为 Google App Engine 编写了一个小型应用程序 每次我想运行我的应用程序时 都会出现以下错误 Running dev appserver with the following flags skip sdk update c
  • php-mysql版本与Mysql服务器冲突

    我安装了 php 5 3 和 mysql 服务器 5 5 我需要安装 php mysql 但出现以下冲突 我该如何解决这个问题 yum install php mysql Loaded plugins fastestmirror Loadi
  • 使用 NGINX proxy_pass 进行 https 域的 Webpack 开发服务器原因:net::ERR_CONNECTION_CLOSED

    我已经设置了一个服务器 它托管一个前端的 angular2 webpack starter 项目和一个nodejs后端 nginx 默认有两个 proxy pass 将连接映射到服务器上的正确位置 几乎一切都按预期进行 但是代理存在问题so
  • 使用 PyMongo 连接数组因未知组运算符“$concatArrays”而失败

    我有 mongodb 数据 例如 word good info tbl id d1 term freq 2 tbl id d2 term freq 56 tbl id d3 term freq 3 word spark info tbl i
  • 将 C++ 二维固定长度 char 数组编组为结构成员

    我正在尝试调用一个非托管 C 函数 该函数具有一个结构作为输入参数 该结构在头文件中定义如下 struct MyStruct int siOrder char aaszNames 6 25 int siId 6 int siTones 6
  • 需要有关本地 CF9/Jrun 安装上的多个 URL 设置的帮助

    我正在本地 Windows XP 计算机上运行 ColdFusion 9 Developer 版本 我已经将它与嵌入式 Web 服务器一起安装 我认为它是 JRun 现在 我只能访问 127 0 0 1 8500 其他位置的网页 我的所有应
  • pandas.replace 与 str.replace 正则表达式冲突。代码顺序

    我的任务是删除括号中的所有内容并删除国家 地区名称后面的所有数字 更改几个国家的名称 例如 玻利维亚 多民族国 应为 玻利维亚 Switzerland17 应该是 瑞士 我原来的代码是这样的 dict1 Republic of Korea
  • 使用 FFMPEG 通过 QuickTime 对可读的电影进行编码

    我正在尝试使用以下命令对图像序列进行编码 ffmpeg exe i d png f mp4 vcodec h264 test mp4 但是 QuickTime 无法打开该文件 或者有时会播放黑色电影 而该电影在 VLC 播放器中播放效果很好
  • 类继承:从继承类的属性重新创建基类项(或实例)

    I have a class A that is inherited from B A 作为我想从 B 修改的一些只读属性 用 new 隐藏这些属性不是一个合适的选择 因为基类有一些使用其自己的属性的函数 不能使用 override 关键字
  • CoffeeScript 模块的模式[重复]

    这个问题在这里已经有答案了 在审查的同时Github 上的 CoffeeScript 源代码 我注意到大多数 如果不是全部 模块定义如下 function call this 这种模式看起来像是将整个模块包装在一个匿名函数中并调用自身 这种
  • 为什么 C++ 中 const 方法不覆盖非常量方法?

    考虑这个简单的程序 class Shape public virtual double getArea 0 class Rectangle public Shape int width int height public Rectangle