纯虚函数调用错误

时间:2016-01-04 05:27:55

标签: c++ virtual-functions

我持续出现一个错误,上面写着“纯虚函数调用”。 经过一些研究后,我发现当从构造函数或抽象基类的析构函数调用纯虚方法时,通常会发生这种错误。 但是,这不是我的代码问题,在花了几个小时试图找到解决方案后,我意识到我需要帮助:)

这是基类:

class Radnik {

string ime;
double procenat;

Radnik(const Radnik& r) = delete;
Radnik& operator = (const Radnik& r) = delete;

public:

Radnik(string i, double p) : ime(i), procenat(p) {}
virtual ~Radnik() {}

virtual double prihod() = 0;

4)...最后在这里调用函数prihod()用于抽象基类

double plata() { return prihod()*procenat / 100; }

3)......在这里

friend ostream& operator << (ostream& it, Radnik& r) { return it << r.ime << " / " << r.plata()<<endl; }


};

Prodavac和Sef是派生类。

这是程序中使用的另一个类:

class Firma {
int rm;
double marza;
Radnik** niz;

public:

Firma(int radna_mesta, double m) : rm(radna_mesta), marza(m) { niz = 
 new Radnik*[rm];  for (int i = 0; i < rm; niz[i++] = nullptr){} }
~Firma() { delete[] niz; }

Firma& operator += (Radnik& r) { for (int i = 0; i < rm; i++)
{if (niz[i] == nullptr) { niz[i] = &r; return *this; } } throw G_fpun(); }
Firma& operator -= (int i) { if (i < 0 || i >= rm) throw G_findeks(); 
if(niz[i + 1] == nullptr) throw G_fbezrad(); niz[i + 1] = nullptr; 
return  *this; }

double dobit() { double prihod(0), plate(0); for (int i = 0; i < rm; i++)
{ prihod += niz[i]->prihod(); plate += niz[i]->plata(); } 
return  prihod*marza / 100 - plate; }

2)......然后从那里跳到

friend ostream& operator << (ostream& it, Firma& f) 
{ for (int i = 0; i < f.rm; i++) 
 { it << "Radnik broj " << i + 1 << " ( " <<    *f.niz[i] << " )" << endl;         
return it << f.dobit(); } }

 };

这是主要计划:

cout << "Koliko radnika ima firma i koja joj je marza (u procentima) ?"; 
int n; double m; cin >> n >> m;
Firma f(n, m);
for (int i = 0; i < n; i++)
{

cout << "\nDa li je radnik broj " << i + 1 << "prodavac (p) ili sef (s) ?"; 

char izb; cin >> izb;

if (izb == 'p' || izb == 'P') { cout << "\nIme, procenat zarade od prihoda i  
prihodi prodavca ?\n"; string im; double pro, pri; cin >> im >> pro >> pri;  
Prodavac p1(im, pro, pri); f += p1; }

if (izb == 's' || izb == 'S') {
cout << "Ime, procenat zarade od prihoda i broj podredjenih ?";
string im; double pro; int brp; cin >> im >> pro >> brp;


if (i + brp>=n) throw G_fpun();

Sef sf(im, pro, brp); f += sf;

for (int j = 0; j < brp; j++){ cout << "\nIme, procenat zarade od prihoda i  
prihodi prodavca ?\n"; 
string ii; double proo; double prii; cin >> ii >> 
proo >> prii; Prodavac p2(ii, proo, prii); f += p2; i++; }

                              }

}
cout << f;

1)当我尝试调用重载运算符&lt;&lt;

时,问题从程序结束处开始^

我试图帮助你定位这段代码,提前感谢你的帮助,我已经被困在这里一整天了。

1 个答案:

答案 0 :(得分:3)

你正在代码中创建临时代码,然后将它们传递给你的+=运算符,该运算符会指向那些随后会被销毁的临时代码:

Prodavac p1(im, pro, pri); f += p1;

当您访问存储在Firma中的(现在无效的)引用时,这会导致未定义的行为。在这种特定情况下,由于引用的对象已被破坏,因此vtable已回滚到基类(其中包含纯虚函数),这会导致错误。