Rzutowanie na klasę bazowa

0

Czesc, jak mozna rzutowac na klase bazowa, ktora ma metode czysto wirtualna?
w klasie Osoba mam:

std::ostream &operator<<(std::ostream &os, const Osoba &ktos) 

Klasa Student dziedziczy po Osobie, jak moge sie dostac do tej funkcji?
Gdy probuje:

vector<Student> studenci;
...
std::cout << dynamic_cast<Osoba> (studenci[i]) 

dostaje:

rzutowanie na klasę abstrakcyjną "Osoba" jest niedozwolone: funkcja "Osoba::~Osoba" to czysta funkcja wirtualna

co tu zrobic?

0

Moar code.

0

metody i inne nie majace tutaj dane znaczenie pochowalem.

class Osoba {
private:
	class Data {
	};
public:
	virtual ~Osoba() = 0;//to je tutaj ta funkcja
};

class BazaDanych {
private:
	class Przedmiot {
	};

	class Student : virtual public Osoba {
	};

	std::vector<Student> studenci;

};
...

void BazaDanych::pokazStudentow() {
	for (int i = 0; i < studenci.size(); i++)
		std::cout << dynamic_cast<Osoba> (studenci[i])/*studenci[i]*/ << std::endl;
}
0

Po prostu dodaj metodę wirtualną odpowiedzialną, za wydrukowanie:

class IOsoba {
public:
    virtual void ~IOsoba() {} // destruktory nie mogą być abstrakcyjne
    virtual ostream &wydrukuj(ostream &out) const;
};

ostream &operator<<(ostream &out, const IOsoba &osoba)
{
    return osoba.wydrukuj(out);
}

class Student : public IOsoba { // po co tu było virtual?
public:
    Student();

    ostream &wydrukuj(ostream &out) const;

    ………
};

Albo zdefiniuj sobie interfejs drukowania (nie ma obowiązku by IOsoba była zawsze osobą, którą można wydrukować).

2

@MarekR22

MarekR22 napisał(a):
class IOsoba {
public:
    virtual void ~IOsoba() {} // destruktory nie mogą być abstrakcyjne
};

Destruktory mogą być abstrakcyjne. A destructor can be declared virtual (10.3) or pure virtual (10.4); if any objects of that class or any derived class are created in the program, the destructor shall be defined. [12.4.9].

class IOsoba {
public:
    virtual void ~IOsoba() = 0;
};
IOsoba::~IOsoba() {}

Natomiast nie można połączyć deklaracji z definicją takiego czysto wirtualnego destruktora: [ Note: A function declaration cannot provide both a pure-specifier and a definition — end note ] [Example: struct C { virtual void f() = 0 { }; // ill-formed }; — end example ] [10.4.2]

1

ten cast jest tam totalnie zbędny

1 użytkowników online, w tym zalogowanych: 0, gości: 1