虚函数关键字

2023-12-06

在子类中声明继承的虚函数有什么区别with“虚拟”关键字or not,考虑到我想调用适合我的对象类型的 fun 。看看评论。

#include <cstdio>
struct A{
    int a;
    A():a(5){}
    virtual int fun(){return a+1;}
};
struct B: public A{
    virtual int fun(){return a+5;} //I put virtual here
//  int fun(){return a+5;} // Any difference if I put virtual before or not?
};
int main(){
    B obj;
    printf("%d\n", static_cast<A>(obj).fun()); // A::fun() called. Why?
    printf("%d\n", static_cast<A&>(obj).fun()); // B::fun() called. As expected
    printf("%d\n", static_cast<A*>(&obj)->fun()); // B::fun() called. As expected
    printf("%d\n", static_cast<A>(B()).fun()); // A::fun() again. Why?
//  printf("%d\n", static_cast<A&>(B()).fun()); //invalid_cast error. Why? 
    printf("%d\n", static_cast<A*>(&B())->fun()); //It works! B::fun() call
    return 0;
}

如果基类中的相应函数是虚拟的,则派生类中的重写函数将隐式声明为“虚拟”。只需确保您获得完全相同的签名,否则您可能会无意中隐藏原始函数并声明一个新函数!

在 C++0x 中,请随意使用override说明符。

你的两个“为什么?”问题是因为slicing;你正在创建新的、复制切片类型的对象A。请注意,在B x; static_cast<A>(x);演员阵容和说的一样A(x).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

虚函数关键字 的相关文章

随机推荐

  • Ajax,防止点击时出现多个请求

    当用户单击登录或注册按钮时 我试图阻止多个请求 这是我的代码 但它不起作用 第一次工作正常 然后返回 false do login click function e e preventDefault if this data request
  • C# - 从数据表中删除具有相同列值的行

    我有一个DataTable看起来像这样 ID Name DateBirth 1 aa 1 1 11 2 bb 2 3 11 2 cc 1 2 12 3 cd 2 3 12 这是删除具有相同 ID 的行的最快方法 以获得类似的结果 保留第一个
  • iterparse 无法解析某个字段,而其他类似的则可以

    我用Python的iterparse解析 nessus 扫描的 XML 结果 nessus 文件 对意外记录的解析失败 但类似的记录已被正确解析 XML 文件的一般结构是很多记录 如下所示
  • 不同的控制器有不同的布局文件

    如何使我的 ZF2 模块加载特定控制器的其他布局文件 考虑你有IndexController and AdminController在您的 ZF2 应用模块中和IndexController正在使用布局 phtml但你想用管理布局 phtm
  • 在目录中递归查找并替换文件名

    我想重命名以以下开头的文件夹中的所有文件123 xxx txt to xxx txt 例如我的目录有 123 xxx txt 123 yyy txt 123 zzz txt 我想将所有文件重命名为 xxx txt yyy txt zzz t
  • WKWebView 缩放以适合

    从 UIWebView 转移到 WKWebView 我无法弄清楚如何使用 WKWebView 大小上的 loadHTMLString 函数加载我正在加载的 HTML 以适应视图边界 我现在可以加载 html 但它超出了我视图的右侧和底部 如
  • Android:将视图拖到屏幕外

    我有一个活动 用户可以在一些按钮周围拖放 我所有的可拖动视图都在RelativeLayout为了拖动它们 我改变了它们的上边距和左边距 一切都很完美 除了当我将视图拖动到靠近屏幕的右侧和底部边缘时 它们会收缩而不是被绘制到屏幕之外 有什么方
  • 如何使用群组碰撞?

    所以我一直想知道如何使用 pygame groupcollide 我现在完全被难住了 因为我使用的是 collide rect 所以没问题 但对于 groupcollide 我似乎无法弄清楚如何调用该组内项目的属性 我不能进行碰撞 因为会有
  • FFmpegAndroid 库在压缩后旋转视频

    execFFmpegBinary new String y i 路径 s 160x120 r 25 vcodec mpeg4 b v 150k b a 48000 ac 2 ar 22050 文件路径 视频压缩后自动旋转 有什么解决办法吗
  • jQuery 代码在 IE 中不起作用

    我是 jQuery 的新手 正在尝试创建这一页 在我测试的所有浏览器中 当我单击红色按钮时 都会出现优惠券代码 IE 除外 为什么会出现这种情况 我该如何解决它 我真的很讨厌这个浏览器 JavaScript coupon button li
  • 使用 Bean Shell 后处理器提取 JSON 响应

    我正在尝试使用 Beanshell 后处理器提取 JSON 数组的一个变量的值 但在日志中没有收到任何响应 我的 JSON 看起来像 store storeId 12345 storeName ABC storeAddress DEFGHI
  • 如何在 mongoose.find 中执行动态数量的条件?

    举个例子 在任何给定的运行时 Books CatSelect SciFi Humor History MinPages 300 50 500 如果我手动将查询写入find函数如下 它按预期工作 并找到页数大于指定类别中指定数量的书籍 MyC
  • RODBC odbcDriverConnect() 连接错误

    我正在尝试使用 odbcDriverConnect driver SQL Server server servername instancename port database testing username abc password 1
  • 从输入的 onchange 调用函数

    我使用控制器作为语法 当我的文件输入发生变化时 我想触发一个函数 怎么做 下面是我使用 scope 语法的代码
  • C# StreamWriter 将额外字节写入 Stream

    var memStream new MemoryStream using var sw new StreamWriter memStream Encoding UTF8 4194304 4 MiB leaveOpen true var st
  • 如何通过 Selenium-Python 访问 'rect' 类型元素

    dom中有一个rect对象
  • 在视图页面中回显

    我试图在视图中回显数据库的字段 但收到错误 消息 尝试获取非对象的属性 文件名 views admin view report php 线路数量 7 当我回显整个数组时 它工作得很好 我找不到问题所在 我的控制器的一部分 function
  • 生成具有重复项目的列表的所有组合

    相关这个问题 我想知道生成所有组合的算法 以及 java c c python 等中的实际代码 如果有的话 r列表的元素m元素总计 其中一些m元素可能会重复 Thanks 对每个元素类型进行递归 int recurseMe list
  • 具有前瞻模式的 grep 命令不会选择任何内容

    我试图使用以下 grep 命令 grep png html jpg js css s png html jpg js css s file 文件包含以下内容 http manage bostonglobe com GiftTheGlobe
  • 虚函数关键字

    在子类中声明继承的虚函数有什么区别with 虚拟 关键字or not 考虑到我想调用适合我的对象类型的 fun 看看评论 include