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