避免派生类 C++ 中的“纯虚函数调用”

2024-03-16

我对 C++ 相当陌生,所以如果这个问题的水平稍微低于这里的通常标准,我想道歉 -

我试图让几个类从具有虚拟函数定义的基类继承,然后我想创建一个 MainClass* 数组,它可以包含所有派生类,以便输出派生+定义的虚拟功能。

我收到错误“R6025:纯虚函数调用” - 我不知道为什么,我假设 - 调用时 - 使用了子类中该函数的更新定义。

这是我的代码:

Base:

class mitarbeiter
{
public:
    mitarbeiter(string name, int nummer);
    ~mitarbeiter(void);
    virtual void einkommen() = 0;
protected:
    string name;
    int nummer;

};

派生1:

#include "mitarbeiter.h"
class lohnempfaenger : public mitarbeiter
{
public:
    lohnempfaenger(int stundenlohn, int anzahlStunden, string name, int nummer);
    ~lohnempfaenger(void);
    void einkommen();
private:
    int stundenlohn;
    int anzahlStunden;
};

推导2:

#include "mitarbeiter.h"
#include <string>
class angestellter : public mitarbeiter
{
public:
    angestellter(int gehalt, string name, int nummer);
    ~angestellter(void);
    void einkommen();
private:
    int gehalt;
};

派生 1 中“einkommen()”的实现:

void lohnempfaenger::einkommen()
{
    cout << "Lohnempfaenger, Name: " << this->name << ", Gesamtlohn: " << this->stundenlohn*this->anzahlStunden << "\n";
}

Derived 2 中“einkommen()”的实现:

void angestellter::einkommen()
{
    cout << "Angestellter, Name: " << this->name << ", Einkommen: " << this->gehalt << "\n";
}

main 方法中的数组声明:

mitarbeiter* mitPtr[5];
mitPtr[0] = &angestellter(/*values...*/);
//error
mitPtr[0]->einkommen();

构造函数:

mitarbeiter::mitarbeiter(string name, int nummer)
{
    this->name = name;
    this->nummer = nummer;
}

angestellter::angestellter(int gehalt, string name, int nummer):mitarbeiter(name, nummer)
{
    this->gehalt = gehalt;
}

lohnempfaenger::lohnempfaenger(int stundenlohn, int anzahlStunden, string name, int nummer):mitarbeiter(name, nummer)
{
    this->stundenlohn = stundenlohn;
    this->anzahlStunden = anzahlStunden;
}

多谢!


现在您已经向我们展示了如何实际初始化指针,问题是:

mitPtr[0] = &angestellter(/*values...*/);

它指向一个临时对象,该对象在语句结束时被销毁。之后使用指针将产生未定义的行为。

您需要一个非临时变量来指向:

angestellter a(/*values...*/);
mitPtr[0] = &a;

或者可能是动态分配的对象:

mitPtr[0] = new angestellter(...);

在这种情况下,请不要忘记将其删除;并且不要忘记为基类提供一个虚拟析构函数,以便可以将其删除。您可以考虑使用智能指针来为您删除它;std::unique_ptr将是理想的。

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

避免派生类 C++ 中的“纯虚函数调用” 的相关文章

随机推荐

  • 使用样式表设置 QGroupBox 标题字体大小

    我希望能够使用样式表设置 QGroupBox 标题的字体大小 我似乎无法弄清楚 根据我读过的内容here http qt project org doc qt 4 7 stylesheet examples html id bfd71794
  • Ansible:无法设置变量以顺序执行

    我正在尝试构建一个带有滚动更新用例 顺序执行 的剧本serial元素 由于我必须在剧本中的多个位置使用序列值 因此我想将其用作变量 可用于将某处定义为组变量 库存档案 all webserver1 ansible host 10 1 1 1
  • Python单元测试中setUp()和setUpClass()有什么区别?

    有什么区别setUp and setUpClass 在Python中unittest框架 为什么要使用一种方法而不是另一种方法来处理设置 我想了解设置的哪一部分是在setUp and setUpClass 函数 以及tearDown and
  • C# WinForms UserControl 鼠标事件帮助

    我有一个为我的项目创建的自定义控件 在此控件中有几个子控件 例如 Label PictureBox 和 LinkLabel 除了 LinkLabel 之外 我希望当前鼠标悬停在父控件上的事件并使控件响应鼠标悬停 当您将鼠标悬停在控件上时 背
  • Azure 网站 Kudu 发布因超时而失败

    我为我的 azure 部署定义了一个自定义部署脚本 sh 脚本 就在今天 我发现我无法发布 我更新了我的 bitbucket 存储库 过了一会儿 我收到类似于以下内容的错误 Command starter cmd deploy pvl co
  • 如何防止express-ejs-layouts 包装我的其他页面?

    我正在寻找 Node js 的页面布局 例如php https laravel com docs 5 0 templates有他们的布局模板 非常完美 我想在node js中实现它 最后找到了这个快速 ejs 布局 https www np
  • 重叠金属点基元和混合

    我正在渲染部分重叠的点基元 片段着色器将每个点基元正方形的部分着色为透明 实心中心圆 不与任何其他点基元重叠的点基元将按预期着色 正方形的透明区域显示背景 当这样的点基元与另一个点基元重叠时 行为是意外的 具体来说 透明区域不显示周围点图元
  • 检查 Selenium 中的 HTTP 状态代码

    如何在Selenium中获取HTTP状态码 例如 所以我可以测试一下 如果浏览器请求 user 27并且不存在ID 27的用户 则返回HTTP 404 我的主要兴趣是 Selenium RC 但如果有人知道 正常 selenium 的答案
  • 如何显示加在一起等于零的行

    几周来一直在寻找解决方案 但一无所获 我有类似这样的数据表 client ref supplier key client amount 1111 GBP 10 1111 GBP 10 1111 EUR 50 2222 CHF 22 5 22
  • 画布内存使用总量超出最大限制 (Safari 12)

    我们正在研究一个可视化网络应用程序 https affinitymap epfl ch它使用 d3 force 在画布上绘制网络 但现在 iOS 上的浏览 器遇到了问题 在与界面进行几次交互后 进程就会崩溃 据我记得 这不是旧版本 iOS1
  • 未知的输入格式:'x11grab'

    guys 当我编译 ffmpeg 并在 linux 中运行 ffmpeg 时遇到问题 我的环境 1 ubuntu 17 10 x64 bit 我认为操作系统版本不是关键 2 gcc Ubuntu 6 3 0 19ubuntu1 6 3 0
  • 我的异步调用在 forEach 循环中填充列表之前返回

    我有一个例程 它从设备获取文件名列表 然后读取文件以构建列表 然而 调用例程总是返回零项 我打印文件名 所以我知道它们存在 但是 在我读取文件之前 异步似乎正在返回 我在进行 HTTP 调用时使用了类似的代码 但是 这里的某些事情导致例程返
  • 什么是 ./.local/share/Trash (Unix) [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用虚拟机来运行 Java Web 应用程序 操作系统是 XFCE Ubuntu 我使用命令找到了我想要的文件find name s
  • 奇怪的 GCC 错误:程序中出现杂散 '\NNN'

    我的开源库中出现了以下问题 我无法弄清楚发生了什么 我的两个用户有 GCC 编译器错误 如下所示 home someone Source src regex cpp 1 1 warning null character s ignored
  • 错误 ITMS - 90167 在包中找到的应用程序包数量

    在开始撰写有关该错误的文章之前 我正在 macOS Sierra 上运行并使用 Xcode 7 3 1 因此 我从我的应用程序创建一个存档 我验证该应用程序并通过验证 但在上传到应用程序商店时 我收到错误 错误 ITMS 90167 在包中
  • 从函数的签名中获取位置参数的名称

    使用 Python 3 x 我尝试从某个函数获取所有位置参数的名称 即 def foo a b c 1 return 现在我正在这样做 from inspect import signature empty args x for x p i
  • 使用 log4net 进行日志记录的最佳实践是什么?

    有人告诉我使用 log4net 将 日志记录 添加到我的代码中 问题是没有人可以及时旅行并查看日志记录需要用来解决哪些现实世界问题 因此 是否有一套关于记录哪些内容以获得合理的成本 收益权衡 所以 应该添加什么类型的日志记录 到一个有用的应
  • 更改 SweetAlert 上的图标图像大小

    我正在尝试更改 SweetAlert 上的图标图像大小 在 css 文件中我看到 sweet alert sa icon width 80px height 80px border 4px solid gray webkit border
  • 从 R Studio 中的 mclapply 打印

    我在 RStudio 中使用 mclapply 并希望从每个进程向控制台输出 但这似乎以某种方式被抑制 例如这里提到的 mclapply 是否保证按顺序返回其结果 https stackoverflow com questions 1469
  • 避免派生类 C++ 中的“纯虚函数调用”

    我对 C 相当陌生 所以如果这个问题的水平稍微低于这里的通常标准 我想道歉 我试图让几个类从具有虚拟函数定义的基类继承 然后我想创建一个 MainClass 数组 它可以包含所有派生类 以便输出派生 定义的虚拟功能 我收到错误 R6025