Witam,
wykonuje ćwiczenia dot. wielokrotnego dziedziczenia.
Mam abstrakcyjna klase Person, dwie klasy które po niej dziedzicza, Poker i Gunslinger.
Klasa Bad dziedziczy wirtualnie po Poker i Gunslinger.
W klasie gunslinger i Poker mam metodę która zwraca losowo wybrana liczbę.
Pytanie, dlaczego w końcowym rezultacie, jeśli załóżmy stworze 2 obiekty gunslinger, + obiekt bad wylosowane wartosci są dla wszytskich takie same?
Ćwiczenie pochodzi z książki Stephena Prata.
Ponizej kod:
#ifndef CLASS_H_INCLUDED
#define CLASS_H_INCLUDED
#include <string>
#include <time.h>
#include <cstdlib>
class Person
{
private:
std::string imie;
std::string nazwisko;
public:
virtual void show();
Person(const char * i ="default",const char * n = "default"): imie(i),nazwisko(n){};
virtual ~Person() = 0;
};
class Gunsligner : public virtual Person
{
private:
int cuts;
public:
void getC(){std::cout<<cuts;}
double draw();
Gunsligner(const char * i ="default",const char * n = "default", int c = 0): Person(i,n),cuts(c){};
virtual void show();
};
class Poker : public virtual Person
{
public:
Poker(const char * i ="default",const char * n = "default"):Person(i,n){};
int draw();//1:52;
virtual void show();
};
class Bad : public Gunsligner, public Poker
{
public:
Bad(const char * i = "default", const char * n ="default",int c = 0 )
: Person(i,n),Gunsligner(i,n,c){};
double Gdraw(){return Gunsligner::draw();}
int Cdraw(){return Poker::draw();}
virtual void show();
};
#endif // CLASS_H_INCLUDED
#include <iostream>
#include "class.h"
using namespace std;
Person::~Person() {};
void Person::show()
{
cout<<imie<<"\n"<<nazwisko<<"\n";
}
void Gunsligner::show()
{
Person::show();
cout << "Czas wyciagania pistoletu: "
<<Gunsligner::draw()<<endl;
cout <<"Liczba naciec: "
<<cuts<<"\n";
}
void Poker::show()
{
Person::show();
cout << "Karta ma numer: "
<<Poker::draw();
cout<<endl;
}
void Bad::show()
{
Person::show();
cout << "Czas wyciagania pistoletu: "
<<Gdraw()<<endl;
cout<< "Liczba naciec: ";
getC();
cout << "Karta ma numer: "
<<Cdraw()<<endl;
cout<<endl;
}
int Poker::draw()
{
srand(time(NULL));
return rand()%52+1;
}
double Gunsligner::draw()
{
srand(time(NULL));
int c;
int a = rand()% 10+1;
int b = rand()% 100+1;
if(a%2 == 0 )
c = rand()% 78+1;
else
c= rand()%56+1;
return (double)(a+b)/c;
}