C++内部如何实现多态性?

2023-11-21

尊敬的先生!

我应该告诉你关于所提出的问题我知道什么和不知道什么,以便你可以解决我理解的薄弱环节。

我知道c++通过使用Vtable(指针数组)来实现多态性 每个指针都指向类的虚函数,层次结构中的每个类都有一个虚函数表。现在假设我有以下课程

class person
{
    char name[20];
public:
    person(char* pname)
    {
        strcpy(name,pname);
    }

    virtual void show()
    {
        cout<<"inside person show method, Name: "<<name;
    }
};

class teacher:public person
{
     int scale;

     teacher(char*pname, int s):person(pname)
     {
         scale=s;
     }

     void show()
     {
         cout<<"inside the teacher show method, Scale: "<<scale;
     }
};

现在假设我在主程序中写入

person *ptr;
ptr=new teacher(16,"Zia");
ptr->show();

现在我很困惑,调用将转到基类的 show 函数,现在因为它是一个虚函数,所以它反过来调用适当的函数。我知道我错了。我很困惑调用的顺序是什么。 Vtable的作用是什么以及它是如何工作的请详细说明。


Since show被宣布virtual in the person类中,编译器不会像非虚拟方法那样对方法调用进行硬编码,而是会在 V 表中编译查找以检索正确的函数。

So ptr->show()将被编译为ptr->vtable['show']()这意味着“搜索与方法对应的函数指针show并执行它”。

由于在运行时,ptr指向类的对象teacher,虚函数表槽show包含一个指向该方法的指针show在课堂里teacher。这就是执行正确方法的原因。

实际上,V 表中的查找不是使用字符串完成的,而是使用数字方法标识符来完成,以便尽可能快。

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

C++内部如何实现多态性? 的相关文章

  • 用于代数简化和求解的 C# 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 网络上有很多代数求解器和简化器 例如 algebra com 上不错的代数求解器和简化器 然而 我正在
  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 为什么 gcc 抱怨“错误:模板参数 '0' 的类型 'intT' 取决于模板参数”?

    我的编译器是gcc 4 9 0 以下代码无法编译 template
  • 使用 C# 读取 Soap 消息

  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看
  • 当我使用 OpenSSL1.1.0g 根据固定的 p 和 g 值创建 Diffie Hellman 密钥协议密钥时,应该执行哪些检查?

    您好 我尝试通过这段代码使用修复 p 和 g 参数来制作 Diffie Hellman Keysanswer https stackoverflow com a 54538811 4706711 include

随机推荐

  • 为什么使用 foreach 时不执行此 LINQ 查询?

    在 LINQ 语句中创建新对象时 例如 var list new List
  • Android开机时启动后台服务

    我需要始终有一个后台服务来同步我的 Android 应用程序和服务器 我知道如何通过我的应用程序启动它 但是当 Android 关闭时 后台服务就会消失 如何才能让后台服务始终运行 即使设备关闭然后再打开 我需要将我的后台服务添加到Andr
  • 如何更改搜索结果中的“使用 create-react-app 创建”?

    我试图将我的投资组合的链接发布到 linkedin 上 但它总是显示 使用 React 应用程序创建的网站 作为描述 这绝对不会使它看起来很专业 它部署在我的域上 但有什么方法可以摆脱我的域链接上的所有 create react app 默
  • 如何实现词性 (POS) 标注器

    我正在寻找基于 PHP 的最佳方法来扫描大量文本条目 分类 并提取关键字 有人知道词性标记吗 有 PHP 风格的方法来做到这一点吗 我扫描了很多在线分类广告 但没有一个有类别 为了加快分类过程 我希望安装词性标注器 http en wiki
  • Laravel Fluent Query Builder 与子查询连接

    好吧 经过几个小时的研究并仍在使用 DB select 我必须问这个问题 因为我正准备扔掉我的电脑 我想获取用户的最后一个输入 基于时间戳 我可以用原始 sql 来做到这一点 SELECT c p FROM users c INNER JO
  • SSRS 计数 IF 多个值

    我正在创建一份教育报告 我有很多成绩 我想将 A C 的成绩数量相加 类似于 SUM WHERE Grades IN A B C 我如何在表达式中执行此操作 我可以对 Choose 语句进行 SUM 或其他操作吗 我试过 SUM Choos
  • 使用 OUT 参数从函数返回列表

    我想创建一个 CMake 函数 function test src list dst list do something endfunction usage test my list chg list 它的意思是 my list是一个包含多
  • SQL Server 中默认的锁定粒度是多少?

    我已彻底阅读MSDN 关于表格提示而且我似乎没有找到默认的锁定粒度 假设我有以下查询 SELECT TOP 1 FROM MyTable WITH UPDLOCK READPAST ORDER BY SomeColumn ASC 你看 我指
  • 通过哈希值比较长字符串

    为了提高比较字符串的函数的性能 我决定通过比较它们的哈希值来比较它们 那么 如果两个非常长的字符串的哈希值彼此相等 那么是否可以保证这些字符串也彼此相等 虽然可以保证 2 个相同的字符串会给您相同的哈希值 但反之则不然 对于给定的哈希值 总
  • Android获取布局父id

    我想知道 View 和 ViewParent 之间有什么区别 我正在尝试获取父级的 IDImageView但这我做不到 myImageView getParent getId 那么还有其他方法可以获取这个id吗 我想知道 View 和 Vi
  • 对 matplotlib 中的不同子图使用相同的颜色条

    我使用以下过程在子图中绘制不同的图形 fig figure figsize 10 11 subplots adjust wspace 0 5 hspace 0 2 iplot 330 for i in range 9 iplot 1 ax
  • Windows.Web.Http.HttpClient 超时选项

    由于 SSL 证书问题 我们在应用程序服务层中使用 Windows Web Http HttpClient API 我为我的项目引用了以下示例 http code msdn microsoft com windowsapps HttpCli
  • 如何从 WCF REST 方法返回自定义 HTTP 状态代码?

    如果 WCF REST 调用中出现问题 例如找不到请求的资源 我如何在我的 OperationContract 方法中使用 HTTP 响应代码 例如 将其设置为 HTTP 404 之类的代码 有一个WebOperationContext您可
  • 如何在 C# 中通过 XML 序列化输出十六进制数字?

    我有一些类和结构 我使用 XML 序列化来保存和调用数据 但我想要的一个功能是以十六进制表示形式输出整数 我可以在这些结构上添加任何属性来实现这一点吗 有一点代码味道 但以下内容will work public class ViewAsHe
  • C# Windows 窗体中的状态栏

    我找不到用于实现状态栏的控件 我怎样才能手动完成呢 我认为您正在寻找 StatusStrip 控件 这是一篇关于它的文章 这是一个MSDN 文章
  • 如何在 Nuxt 中使路由区分大小写

    我使用 nuxt js vue js 我需要创建路由器区分大小写 我发现以下属性 caseSensitive 我试图将其放入 nuxt config 但它不起作用 可以通过大写的链接进行转换 如果我直接更改文件 project nuxt r
  • 如何在R中用多边形裁剪世界地图?

    我导入了世界地图数据集www GADM org使用 R 包栅格 我想将其剪切到我创建的多边形中以减小地图的大小 我可以检索数据并且可以毫无问题地创建多边形 但是当我使用 gIntersection 命令时 我收到一条晦涩的错误消息 关于如何
  • JavaMail 与 Gmail:535-5.7.1 用户名和密码不被接受

    当我尝试使用 JavaMail API 发送邮件时收到错误 并且我确信用户名和密码 100 正确 我连接的 Gmail 帐户是一个较旧的帐户 因为他们说它需要时间才能与新帐户一起使用 收到错误 DEBUG SMTP RCVD 535 5 7
  • 无法初始化类 com.amazonaws.partitions.PartitionsLoader

    使用 Eclipse Mars 我已经通过帮助安装软件添加了 aws java sdk 1 11 123 现在 当我运行 Tomcat Server 7 时 出现此错误 May 02 2017 11 57 32 PM org apache
  • C++内部如何实现多态性?

    尊敬的先生 我应该告诉你关于所提出的问题我知道什么和不知道什么 以便你可以解决我理解的薄弱环节 我知道c 通过使用Vtable 指针数组 来实现多态性 每个指针都指向类的虚函数 层次结构中的每个类都有一个虚函数表 现在假设我有以下课程 cl