2016-01-04 83 views
-1

我持续发生一个说“纯虚函数调用”的错误。 经过一番研究后,我发现当从构造函数或抽象基类的析构函数调用纯虚方法时,通常会发生此类错误。 然而,这不是我的代码问题,花几个小时试图找到解决办法,我意识到我需要帮助:)纯虚拟函数调用错误

这是基类:

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)问题从这里开始^ at the en方案d,当我尝试调用重载操作< <

我试图帮助你在这段代码进行定向,预先感谢您的帮助,我已经困在这里了整整一天。

+4

由于格式不佳,您的代码非常难以阅读。 –

+1

你在哪里提供prihod()成员函数的定义? – rici

+0

同意rici,prihod方法是抽象的我猜其中一个派生类没有实现它。你甚至使用Radnik本身,它有一个抽象方法...并且当你使用C++ 1x元素(= delete,nullptr等)时,为什么不能一路走下去,用智能指针替换**,新的和删除的东西? – gilgamash

回答

3

你在你的代码中创建的临时,然后将它们传递给你的+=运营商这使一个指针,然后被摧毁那些临时工:

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

这导致不确定的行为,当你访问(现无效)存储在Firma中的引用。在这种特定情况下,由于被引用的对象已被销毁,所以vtable已经被回滚到基类(带有纯虚函数),这会导致你的错误。