У меня есть простой базовый класс C ++, пример производного класса.
// 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;
}
Если я сейчас сделаю указатель на Base, это прекрасно скомпилируется.
//Main.cpp
#include "stdafx.h"
#include "Base.hpp"
#include "Derived.hpp"
Base *obj = new Derived();
Но если я сделаюуказатель на класс Derived, затем компилятор (VC 2008 и 2010) жалуется, что:
Main.cpp(12): error C2660: 'Derived::setData' : function does not take 2 arguments
А вот код, который вызывает эту ошибку:
//Main.cpp
#include "stdafx.h"
#include "Base.hpp"
#include "Derived.hpp"
Derived *obj = new Derived();
Кажется, чтометоды базового класса скрыты.У меня сложилось впечатление, что поскольку методы базового класса являются виртуальными, они должны быть видны даже при просмотре с помощью указателя на производное, или я ошибаюсь?