मेरे पास एक साधारण सी ++ बेस क्लास है, व्युत्पन्न क्लास उदाहरण है।सी ++ विरासत, आधार विधियों को छिपा
// 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;
}
यदि अब मैं आधार पर एक सूचक बना देता हूं तो यह ठीक से संकलित होता है।
//Main.cpp
#include "stdafx.h"
#include "Base.hpp"
#include "Derived.hpp"
Base *obj = new Derived();
लेकिन अगर मैं व्युत्पन्न वर्ग के लिए एक सूचक है, तो संकलक (वीसी 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();
ऐसा लगता है कि बेस क्लास विधियों को छुपाया जा रहा है। मैं इस धारणा के तहत था कि बेस क्लास विधियों वर्चुअल हैं क्योंकि वे व्युत्पन्न सूचक से देखे जाने पर भी दिखाई दे सकते हैं, या क्या मैं गलत हूं?
आपकी व्युत्पन्न कक्षा कैसी दिखती है? –
संभावित डुप्लिकेट [सी ++ में बेस के अधिभारित फ़ंक्शन को ओवरराइड करना] (http://stackoverflow.com/questions/888235/overriding-a-bases-overloaded-function-in-c) –