我是C++的新手,所以如果这个问题的级别比这里的通常标准低一点,我想道歉-
我试图从一个有虚拟函数定义的基类中继承几个类,然后我想创建一个MainClass*数组,它可以包括所有派生类,以便输出派生+定义的虚拟函数。
我收到错误"R6025:纯虚拟函数调用"-我不知道为什么,我假设在调用时使用了子类中该函数的更新定义。
这是我的代码:
基础:
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";
}
派生2:中"einkommen()"的实现
void angestellter::einkommen()
{
cout << "Angestellter, Name: " << this->name << ", 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, 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(...);
在这种情况下,不要忘记删除它;别忘了给基类一个虚拟析构函数,这样它就可以被删除。您可以考虑使用智能指针为您删除它;CCD_ 1将是理想的。
我猜您在运行时看到的错误消息是,正在调用mitarbiter::einkommen()。
您的主代码声称正在分配一个新的angestelter,您没有提供其代码,但该调用可能隐藏在几个地方。
如果mitarbiter::mitarbiter调用einkommen(),则无论您将哪种类型指定为new,都将获得mitarbite::einkomme()。这似乎是最有可能的地方。
其他可能性是在angestelter::angestelter()或angestelteer::einkommen()中显式调用完全限定的mitarbiter::ein kommen。