在派生类C中避免“纯虚函数调用”
发布时间:2020-12-16 09:49:02 所属栏目:百科 来源:网络整理
导读:我是C的新手,所以如果这个问题的水平略低于通常标准,我还是要道歉 – 我正在尝试从具有虚函数定义的基类继承几个类,然后我想创建一个MainClass *数组,它可以包含所有派生类,以便输出派生定义的虚函数. 我收到错误“R6025:纯虚函数调用” – 我不知道为什么,
我是C的新手,所以如果这个问题的水平略低于通常标准,我还是要道歉 –
我正在尝试从具有虚函数定义的基类继承几个类,然后我想创建一个MainClass *数组,它可以包含所有派生类,以便输出派生定义的虚函数. 我收到错误“R6025:纯虚函数调用” – 我不知道为什么,我假设 – 当被调用时 – 使用子类中该函数的更新定义. 这是我的代码: 基础: class mitarbeiter { public: mitarbeiter(string name,int nummer); ~mitarbeiter(void); virtual void einkommen() = 0; protected: string name; int nummer; }; Derived1: #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,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,Einkommen: " << this->gehalt << "n"; } 主方法中的数组声明: 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,int nummer):mitarbeiter(name,nummer) { this->gehalt = gehalt; } lohnempfaenger::lohnempfaenger(int stundenlohn,nummer) { this->stundenlohn = stundenlohn; this->anzahlStunden = anzahlStunden; } 非常感谢! 解决方法
现在你已经向我们展示了你如何实际初始化指针,这是问题所在:
mitPtr[0] = &angestellter(/*values...*/); 这指向一个临时对象,该对象在语句结束时被销毁.之后使用指针将给出未定义的行为. 你需要一个非临时变量来指向: angestellter a(/*values...*/); mitPtr[0] = &a; 或者可能是动态分配的对象: mitPtr[0] = new angestellter(...); 在这种情况下,不要忘记删除它;并且不要忘记给基类一个虚拟析构函数,以便删除它.您可以考虑使用智能指针为您删除它; std :: unique_ptr是理想的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- vb.net – 如何将一个很长的二进制数转换为十进制?
- sqlite的索引优化
- [Swift]LeetCode385. 迷你语法分析器 | Mini Parser
- ruby-on-rails – 测试ApplicationController过滤器,Rails
- Material Design设计规范
- cocos2d-iphone – 使Box2d对象遵循预定路径
- c# – 如何覆盖两个图像(作为字节数组)
- ruby-on-rails – 多个应用语句在一个rspec it子句 – 坏主
- 当ajax调用更改其值时,不会更新AngularJS中的javascript-ng
- Flash Media Server 4.5