避免派生类C++中的"Pure Virtual Function Call"



我是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。

最新更新