A
Alex Vinokur
Hello,
Here is some program with virtual constructors.
Is there any difference between
* clone1() vs. clone2()
* create1() vs. create2() ?
It seems that it should be.
The program has been successfully compiled and invocated.
------ C++ code : BEGIN ------
class Shape
{
public:
virtual ~Shape() {}
virtual void draw() = 0;
virtual Shape* clone1() const = 0;
virtual Shape* create1() const = 0;
virtual Shape* clone2() const = 0;
virtual Shape* create2() const = 0;
};
class Circle : public Shape
{
public:
void draw() {}
// --- Covariant Return Types ---
Circle* clone1() const { return new Circle(*this); }
Circle* create1() const { return new Circle();}
// ------------------------------
// --- NonCovariant Return Types ---
Shape* clone2() const { return new Circle(*this); }
Shape* create2() const { return new Circle();}
// ---------------------------------
};
void userCode(Shape& s)
{
Shape* sclone1 = s.clone1();
Shape* screate1 = s.create1();
Shape* sclone2 = s.clone2();
Shape* screate2 = s.create2();
sclone1->draw();
screate1->draw();
sclone2->draw();
screate2->draw();
delete sclone1;
delete screate1;
delete sclone2;
delete screate2;
}
int main()
{
Shape* s = new Circle;
userCode (*s);
delete s;
return 0;
}
------ C++ code : END --------
Here is some program with virtual constructors.
Is there any difference between
* clone1() vs. clone2()
* create1() vs. create2() ?
It seems that it should be.
The program has been successfully compiled and invocated.
------ C++ code : BEGIN ------
class Shape
{
public:
virtual ~Shape() {}
virtual void draw() = 0;
virtual Shape* clone1() const = 0;
virtual Shape* create1() const = 0;
virtual Shape* clone2() const = 0;
virtual Shape* create2() const = 0;
};
class Circle : public Shape
{
public:
void draw() {}
// --- Covariant Return Types ---
Circle* clone1() const { return new Circle(*this); }
Circle* create1() const { return new Circle();}
// ------------------------------
// --- NonCovariant Return Types ---
Shape* clone2() const { return new Circle(*this); }
Shape* create2() const { return new Circle();}
// ---------------------------------
};
void userCode(Shape& s)
{
Shape* sclone1 = s.clone1();
Shape* screate1 = s.create1();
Shape* sclone2 = s.clone2();
Shape* screate2 = s.create2();
sclone1->draw();
screate1->draw();
sclone2->draw();
screate2->draw();
delete sclone1;
delete screate1;
delete sclone2;
delete screate2;
}
int main()
{
Shape* s = new Circle;
userCode (*s);
delete s;
return 0;
}
------ C++ code : END --------