[C++] Non dovrebbe compilare eppure compila

di il
2 risposte

[C++] Non dovrebbe compilare eppure compila

Salve, a scopo didattico ho fatto la prova qui di seguito, mi aspettavo un errore in fase di compilazione invece non è accaduto (gcc version 6.3.0 20170516).

Di seguito ci sono i sorgenti forma.h, quadrato.h e quadrato.cpp (forma.cpp non lo riporto perchè non è importante per la domanda):

//forma.h
#ifndef FORMA_H
#define FORMA_H
#include <iostream>
#include <string>

namespace Geometria
{
        class Forma;
}

class Geometria::Forma
{
private:
        std::string label;
public:
        Forma(std::string lab = "");
        virtual ~Forma();
        std::string getLabel();
        void setLabel(std::string lab);
        virtual int area() = 0;
};
#endif

//quadrato.h
#ifndef QUADRATO_H
#define QUADRATO_H
#include "forma.h"
#include <string>
#include <iostream>

namespace Geometria
{
        class Quadrato;
}

class Geometria::Quadrato : private Geometria::Forma
{
public:
        Quadrato();
        Quadrato(int lunghezzaLato);
        ~Quadrato();
        virtual int area() override;
private:
        int lato;
};
#endif

//quadrato.cpp
#include "forma.h"
#include "quadrato.h"
using namespace std;

Geometria::Quadrato::Quadrato() :Forma()
{
        lato = 0;
}

Geometria::Quadrato::Quadrato(int lunghezzaLato) : Forma()
{
        lato = lunghezzaLato;
}

Geometria::Quadrato::~Quadrato()
{
        cout << "distruttore di quadrato" << endl;
}

int Geometria::Quadrato::area()
{
        int a = lato * lato;
        return a;
}

su forma.h ho definito il metodo virtuale puro area() come pubblico, la classe quadrato estende forma tramite ereditarietà privata, quindi il metodo area() su quadrato dovrebbe diventare privato, eppure dichiararlo in quadrato.h come pubblico non causa nessun errore di compilazione (ho messo anche override quindi dovrebbe capire che sto reimplementando quello ereditato), perchè?

Grazie
Ado

2 Risposte

  • Re: [C++] Non dovrebbe compilare eppure compila

    PERCHE' dovrebbe cambiare la sua visibilita' SE lo hai dichiarato pubblico in ENTRAMBE le classi?
    La visibilita' non cambia per magia.
    Per la precisione, non cambia proprio!
  • Re: [C++] Non dovrebbe compilare eppure compila

    migliorabile ha scritto:


    PERCHE' dovrebbe cambiare la sua visibilita'
    La classe Quadrato eredita da Forma in modo privato:
    
    class Geometria::Quadrato : private Geometria::Forma
    
    Questo vuol dire che mentre il metodo area() su Forma è pubblico, in Quadrato diventa un metodo privato, sbaglio? Al momento in cui in quadrato.h viene fatto l'override di area() dichiarandolo public, il compilatore dovrebbe segnalare qualcosa... o no?
Devi accedere o registrarti per scrivere nel forum
2 risposte