[C++] Array di oggetti

Pic143
Salve, in seguito ad un corso universitario di c++ sto approfondendo da solo la materia. Individualmente sono passato a trattare la programmazione orientata ad oggetti e mi è sorto un dubbio riguardante gli array di oggetti (in particolare utilizzo la libreria ).
Rifacendomi al Monopoli ho implementato una classe madre chiamata casella e delle classi figlie chiamate terreno, stazioni,probabilità ecc... . Ho strutturato il tabellone come un vettore contenente puntatori ad oggetti casella

std::vector Tabellone

Dopo averlo riempito esclusivamente con classi figlie non riesco ad accedere ai metodi e alle variabili (public ovviamente) degli oggetti: gli elementi del vettore, dichiarati come puntatori ad oggetti casella, sembrano impedire la lettura del fatto che di per sè gli oggetti sono specializzati a terreni e non sono soltanto caselle.
Supponiamo che abbia implementato due metodi:

void casella::Stampa(){
std::cout<<"casella"< }

void terreno::Stampa(){
std::cout<<"terreno"< }

Le righe di codice

terreno* t1=new terreno;
Tabellone.push_back(t1);
Tabellone[0]->Stampa();

restituiscono come output la scritta "casella".
Ho risolto usando uno static_cast come segue:
static_cast(Tabellone[0])->Stampa();

Tuttavia questo mi sembra un modo molto "artificiale" e mi sa di cosa non pienamente corretta. Qualcuno potrebbe illuminarmi? Grazie in anticipo :D

Risposte
vict85
Da quel che dici sembra che tu non sia arrivato/a al concetto di metodo virtuale.

Per capirci:
#include <iostream>
 
class casella
{
public:
    virtual void print()
    {
        std::cout << "casella" << std::endl;
    }
};
 
class terreno : public casella
{
public:
    void print() override
    {
        std::cout << "terreno" << std::endl;
    }
};
 
int main()
{
    casella *a = new casella;
    casella *b = new terreno;
    a->print();
    b->print();
    delete a;
    delete b;
}

Pic143
Grazie per la risposta. Guardo subito cos' è il metodo virtuale. Una domanda: la scritta "override" è necessaria per dirgli di prendere il posto del metodo di casella o va "in coppia" con il metodo virtuale che deve ancora guardare? Fino ad ora non l' ho usata.

Raptorista1
La parola chiave [inline]override[/inline] indica al compilatore che, col metodo che stai dichiarando, hai intenzione di fare un override. Non è necessario specificare [inline]override[/inline] per avere un override, tuttavia, se lo fai, il compilatore verifica che il metodo in questione sia effettivametne un override, e ti avverte in caso contrario. È consigliato usarlo se possibile: [inline]override[/inline] è disponibile in C++11 e successivi.

vict85
Se la tua intenzione è di riempire le caselle con sole classe figlie, puoi anche non implementare la funzione virtuale per la classe madre, ovvero usare una funzione virtuale pura:
class casella
{
public:
    virtual void print() = 0;
};


In ogni caso ti conviene proseguire nello studio del tuo manuale.

Pic143
Non ho un manuale. Per il corso in questione ho studiato da appunti e materiale fornito dal prof. Per proseguire i miei studi sto andando un po' alla cieca essendo più un hobby che uno studio vero e proprio. Programmazione just for fun per intenderci. Sarei felicissimo se me ne consigliassi uno ben fatto che si concentri magari più sulla parte oop non trattata a lezione. Grazie! :D

vict85
Sono decenni che non leggo libri di programmazione base in C++. Negli ultimi anni ho più che altro letto libri più specifici, e non ho mai letto nulla di OOP, paradigma che non amo affatto.
Se vuoi una preparazione abbastanza completa suppongo C++ primer https://www.pearson.com/us/higher-educa ... 70560.html oppure lo Stroustup https://www.stroustrup.com/4th.html possano contenere tutto quello che potrebbe servirti e molto di più. Anche se non sono aggiornati agli ultimi standard. Ma gli ultimi standard li puoi anche vedere dopo. Eviterei i libri precedenti al C++11. Non so se faranno delle nuove versioni per il C++20.
Generalmente, quando ho dubbi, vado semplicemente su https://en.cppreference.com/w/ (meglio quella inglese). Se il problema sono solo le funzioni virtuali, qualsiasi tutorial su internet (o video su youtube) dovrebbe fornirti abbastanza informazioni, anche senza libri. E puoi sempre chiedere consigli qui.

Super Squirrel
Magari dai anche un'occhiata qui:
http://www-old.bo.cnr.it/corsi-di-infor ... ndice.html

Pic143
Grazie mille dei consigli!

vict85
"Super Squirrel":
Magari dai anche un'occhiata qui:
http://www-old.bo.cnr.it/corsi-di-infor ... ndice.html


A occhio mi sembra per-c++11... Dovrebbero aggiornarlo: il c++11 ha cambiato il modo in cui si programma in C++.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.