Возможный дубликат:
Вызов виртуальных функций внутри конструкторов
У меня есть класс Shape и его подкласс Sphere:
//Shape :
class Shape
{
public:
Shape(const string& name);
virtual ~Shape();
virtual string getName();
protected:
string mName;
};
Shape::Shape(const string& name) : mName(name)
{
/*Some stuff proper to Shape*/
/*Some stuff proper to subclass (sphere)*/
/*Some stuff proper to Shape*/
}
Shape::~Shape(){}
string Shape::getName(){ return mName; }//Sphere :
class Sphere : public Shape
{
public:
Sphere(const string& name, const float radius);
virtual ~Sphere();
virtual string getRadius();
protected:
float mRadius;
}
Sphere::Sphere(const string& name, const float radius) : Shape(name), mRadius(radius)
{
/*Some stuff*/
}
Sphere::~Sphere(){}
float Sphere::getRadius(){ return mRadius; }
Теперь, как я могу обработать материал подкласса в конструкторе Shape? Я мог бы прибегнуть к шаблонный шаблон но я был бы вынужден вызвать чисто виртуальную функцию в конструкторе; Я пытался, и компилятору это не понравилось
редактировать :
Я решил переместить конструктор в новый метод, init, и виртуальный метод будет subInit:
//Shape :
class Shape
{
public:
Shape(const string& name);
virtual ~Shape();
virtual string getName();
virtual void init();
protected:
string mName;
virtual void subInit() = 0;
};
Shape::Shape(const string& name) : mName(name){}
Shape::~Shape(){}
string Shape::getName(){ return mName; }
void Shape::init()
{
/*Some stuff proper to Shape*/
/*Some stuff proper to subclass (sphere)*/
/*Call to the pure virtual function subInit*/
subInit();
/*Some stuff proper to Shape*/
}
//Sphere :
class Sphere : public Shape
{
public:
Sphere(const string& name, const float radius);
virtual ~Sphere();
virtual string getRadius();
protected:
float mRadius;
void subInit();
}
Sphere::Sphere(const string& name, const float radius) : Shape(name),mRadius(radius)
{}
Sphere::~Sphere(){}
float Sphere::getRadius(){ return mRadius; }
Sphere::subInit()
{
/*Some stuff previously in the constructor*/
}
Это в основном шаблонный шаблон
Клиент напишет:
Shape* sphere = new Sphere();
sphere->init();
Тогда у меня есть ответ: невозможно применить этот шаблон в конструкторе, по крайней мере, в C ++
Shape::Shape(const string& name) : mName(name)
{
/*Some stuff proper to Shape*/
/*Some stuff proper to subclass (sphere)*/
/*Some stuff proper to Shape*/
}
Вещи, соответствующие собственному подклассу, не могут выполняться, пока подкласс не существует, поэтому он должен идти в конструкторе подкласса. Более поздние вещи могут затем войти в функцию, вызываемую конструктором подкласса.
Shape::Shape(const string& name) : mName(name)
{
/*Some stuff proper to Shape*/
}
void Shape::finishConstruction()
{
/*Some stuff proper to Shape*/
}
Sphere::Sphere(const string& name, const float radius)
: Shape(name), mRadius(radius)
{
/*Some stuff proper to subclass (sphere)*/
finishConstruction();
}
Других решений пока нет …