Ho una semplice classe base C++, esempio di classe derivata.ereditarietà C++, metodi di base nascosti
// Base.hpp
#pragma once
class Base
{
public:
virtual float getData();
virtual void setData(float a, float b);
virtual void setData(float d);
protected:
float data;
};
//Base.cpp
#include "stdafx.h"
#include "Base.hpp"
float Base::getData()
{
return data;
}
void Base::setData(float a, float b)
{
setData(a);
}
void Base::setData(float d)
{
data = d;
}
//Derived.hpp
#pragma once
#include "Base.hpp"
class Derived
: public Base
{
public:
virtual void setData(float d);
};
//Derived.cpp
#include "stdafx.h"
#include "Derived.hpp"
void Derived::setData(float d)
{
data = d + 10.0f;
}
Se ora faccio un puntatore alla Base questo compila bene.
//Main.cpp
#include "stdafx.h"
#include "Base.hpp"
#include "Derived.hpp"
Base *obj = new Derived();
Ma se faccio un puntatore alla classe derivata, quindi il compilatore (VC 2008 e il 2010) lamenta che:
Main.cpp(12): error C2660: 'Derived::setData' : function does not take 2 arguments
E qui è il codice che causa questo errore:
//Main.cpp
#include "stdafx.h"
#include "Base.hpp"
#include "Derived.hpp"
Derived *obj = new Derived();
Sembra che i metodi della classe base vengano nascosti. Avevo l'impressione che dal momento che i metodi della classe base sono virtuali, dovrebbero essere visibili anche se visualizzati dal puntatore Derivato, o sbaglio?
Che aspetto ha la classe derivata? –
possibile duplicato di [Sovrascrivere la funzione sovraccaricata di una base in C++] (http://stackoverflow.com/questions/888235/overriding-a-bases-overloaded-function-in-c) –