C++ 重写方法

2023-12-23

我不明白这是怎么回事。

我有一个场景类,它具有实体向量,并允许您从场景中添加和获取实体:

class Scene {
    private:
        // -- PRIVATE DATA ------
        vector<Entity> entityList;
    public:
        // -- STRUCTORS ---------
        Scene();
        // -- PUBLIC METHODS ----
        void addEntity(Entity); // Add entity to list
        Entity getEntity(int); // Get entity from list
        int entityCount();
};

我的实体类如下(输出用于测试):

class Entity {
    public:
        virtual void draw() { cout << "No" << endl; };
};

然后我有一个继承自 Entity 的 Polygon 类:

class Polygon: public Entity
{
    private:
        // -- PRIVATE DATA ------
        vector<Point2D> vertexList; // List of vertices
    public:
        // -- STRUCTORS ---------
        Polygon() {}; // Default constructor
        Polygon(vector<Point2D>); // Declare polygon by points
        // -- PUBLIC METHODS ----
        int vertexCount(); // Return number of vertices
        void addVertex(Point2D); // Add vertex
        void draw() { cout << "Yes" << endl; }; // Draw polygon
        // -- ACCESSORS ---------
        Point2D getVertex(int); // Return vertex
};

正如您所看到的,它有一个draw()方法,该方法应该覆盖它从Entity类继承的draw()方法。

但事实并非如此。当使用以下代码时:

scene->getEntity(0).draw();

其中实体 0 是一个多边形(或者至少应该是),它从父方法打印“否”(就好像它不是一个多边形,只是一个实体)。事实上,它似乎不允许我调用 Polygon 特有的任何方法而不会得到:

'一些方法名称' : 不是“实体”的成员

那么知道怎么回事吗?

谢谢您的帮助。

UPDATE:

所以我已经实现了第一个答案中给出的代码,但我不确定如何将我的多边形添加到列表中。像这样的东西吗?

const tr1::shared_ptr<Entity>& poly = new Polygon;
poly->addVertex(Point2D(100,100));
poly->addVertex(Point2D(100,200));
poly->addVertex(Point2D(200,200));
poly->addVertex(Point2D(200,100));
scene->addEntity(poly);

我只是不习惯这种shared_ptr业务。


我认为你需要发布你的调用代码,但本质上的问题是这样的。

你有一个具体的课程Polygon从另一个具体类派生Entity。您的 addEntity 和 getEntity 函数接受并返回一个Entity by value所以如果你尝试传入或检索Entity,您将仅复制Entity该对象的一部分(对其进行切片)以及有关该对象的派生部分的信息将丢失。

另外你还有一个vector of Entity,它是基类对象的向量,因此您无法存储除对象的基类型之外的任何内容。

如果您需要拥有混合类型对象的集合,但全部派生自Entity,您可能需要使用动态创建的对象和某种智能指针,例如tr1::shared_ptr or a boost::shared_ptr.

E.g.

class Scene {
    private:
        // -- PRIVATE DATA ------
        vector< std::tr1::shared_ptr<Entity> > entityList;
    public:
        // -- STRUCTORS ---------
        Scene();
        // -- PUBLIC METHODS ----
        void addEntity( const std::tr1::shared_ptr<Entity>& ); // Add entity to list
        const std::tr1::shared_ptr<Entity> getEntity(int); // Get entity from list
        int entityCount();
};

Edit

尽管使用对共享指针的本地常量引用有点晦涩,但更新后的调用代码本质上是正确的。

我可能会选择类似的东西:

std::tr1::shared_ptr<Polygon> poly( new Polygon );
poly->addVertex(Point2D(100,100));
poly->addVertex(Point2D(100,200));
poly->addVertex(Point2D(200,200));
poly->addVertex(Point2D(200,100));
scene->addEntity(poly);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 重写方法 的相关文章

  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

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

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没

随机推荐

  • PlayFramework 2 + Ebean - 原始 Sql 更新查询 - 对数据库没有影响

    我有一个 play Framework 2 0 4 应用程序想要修改数据库中的行 我需要将数据库中的 少数 消息更新为 已打开 状态 读取消息 我做了如下 String sql UPDATE message SET opened true
  • 为什么 Pandas 默认会迭代 DataFrame 列?

    尝试了解 Pandas 某些功能背后的设计原理 如果我有一个包含 3560 行和 18 列的 DataFrame 那么 len frame 是3560 但是 len a for a in frame is 18 也许对于来自 R 的人来说这
  • MySQL 事务难题

    我需要在单个原子事务中执行多次插入 例如 开始交易 插入 插入 commit 然而 当 MySQL 遇到错误时 它只会中止导致错误的特定语句 例如 如果第二个插入语句中有错误 提交仍然会发生 并且第一个插入语句将被记录 因此 当发生错误时
  • 如何处理使用相同库的许多 Web 应用程序的共享库

    我们有一个用 Java 制作的 Web 应用程序 它使用了 struts2 spring 和 JasperReport 该应用程序在 glassfish 4 0 上运行 应用程序的库位于 WEB INF lib 文件夹中 并且在 glass
  • 一次性渲染到完整的 3D 渲染目标

    使用 DirectX 11 我创建了一个可以绑定为渲染目标的 3D 体积纹理 D3D11 TEXTURE3D DESC texDesc3d texDesc3d Usage D3D11 USAGE DEFAULT texDesc3d Bind
  • 适用于 Windows 8 Metro 应用程序的免费 PDF 编写器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Rails 和 标签

    我对 Ruby on Rails 相当陌生 我正在尝试使用 滑动门 技术创建一些精美的 CSS 按钮 我几乎可以正常工作了 但我觉得必须有更好的方法来处理链接的标签 我目前正在做的方式 这本身并不可怕 但我想知道这是否是在 RoR 中处理跨
  • 为什么 Windows 32 位称为 Windows x86 而不是 Windows x32? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Windows 操作系统可以是 32 位或 64 位 这64 bit版本称为Windows x64但是32 bit版本称为Windows
  • 使用 Anaconda 下载 Random.py

    我正在尝试下载随机模块 想知道是否复制代码并将其放入文件编辑器中 如何通过 pip 安装它 我将代码放在记事本中 并将其保存在桌面上 名称为 random py 我现在该怎么做才能通过 anaconda 安装它 我尝试了 pip insta
  • Django:扩展用户模型与创建用户配置文件模型

    我正在 Django 中创建一个应用程序 到目前为止我一直在使用扩展用户模型 如下所示 class MyUser AbstractBaseUser 包含所有用户和个人资料信息 但我看到很多人在堆栈溢出上为个人资料和用户本身创建不同的模型 使
  • 在正则表达式替换中捕获字符串

    根据我从 Pharo 正则表达式文档中收集到的信息 我可以定义一个正则表达式对象 例如 re foo re bar asRegex 我可以通过以下方式将匹配的正则表达式替换为字符串 re copy foobar blah rebar rep
  • ASP.NET MVC 从单个视图向相关多个表添加记录

    我对 MVC 很陌生 所以如果我没有正确解释我的要求 没有使用正确的术语 我深表歉意 我有一个简单的数据库item and detail实体 它们具有一对多的关系 因此 Item 有许多详细信息 我想从单个视图向这两个表添加记录 到目前为止
  • 如何更改 UISearchBar 占位符和图像色调颜色?

    我已经尝试了几个小时的搜索结果 但我无法弄清楚这一点 也许这是不可能的 我正在尝试更改占位符文本和 UISearchBar 放大镜的色调颜色 如果重要的话 我只针对 iOS 8 0 这是我的代码以及现在的样子 let searchBar U
  • Robotium:如何在 Intellij IDEA 中为现有项目创建测试项目?

    我一直在为现有项目创建一个测试项目 对于 Eclipse 来说很简单 但是对于 IntelliJ 我被迫在工作场所使用它 我真的不知道如何使用 Robotium 框架测试项目 如果有人可以写一些明确的步骤来解释这一点 我将不胜感激 在 In
  • 为什么 Python 中的某些列表方法仅适用于已定义的变量? [复制]

    这个问题在这里已经有答案了 gt gt gt a 1 2 3 gt gt gt a append 4 gt gt gt a 1 2 3 4 But gt gt gt 1 2 3 append 4 gt gt gt Why do list h
  • Swift 中的多维数组

    编辑 正如 Adam Washington 指出的那样 从 Beta 6 开始 这段代码按原样工作 所以这个问题不再相关 我正在尝试创建并迭代二维数组 var array Array count NumColumns repeatedVal
  • 如何使用Excel VBA确定文件编码类型

    我构建了一个 Excel VBA 工具来验证 csv 文件 以确保它们包含的数据有效 它们的 csv 可以来自任何地方 来自完整的 UNIX 系统或从 Excel 保存数据的桌面用户 Excel 工具被发送给企业 以便他们可以在自己的环境中
  • 如何创建列表集合的深层副本

    假设我有以下课程 public class Author public int ID get private set public string firstName get private set public string lastNam
  • 无法在我的 Android 应用程序中播放 mp4 视频

    我非常想在我的 Android 应用程序中播放 mp4 视频 我什至为它写了一些代码 String sourceUrl http tvstream cn ru storage 1kanal 20120530 1kanal 20120530
  • C++ 重写方法

    我不明白这是怎么回事 我有一个场景类 它具有实体向量 并允许您从场景中添加和获取实体 class Scene private PRIVATE DATA vector