// -------------------
// AbstractClasses.c++
// -------------------
#include <cassert> // assert
#include <iostream> // cout, endl
#include "Shapes.h"
int main () {
using namespace std;
cout << "AbstractClasses.c++" << endl;
/*
{
AbstractShape x(2, 3);
x.move(4, 5);
assert(x.area() == 0);
// assert(x.radius() == 0); // doesn't compile
}
{
const AbstractShape x(2, 3);
AbstractShape y(4, 5);
assert(x != y);
y = x;
assert(x == y);
}
*/
{
Circle x(2, 3, 4);
x.move(5, 6);
assert(x.area() == 3.14 * 4 * 4);
assert(x.radius() == 4);
}
{
const Circle x(2, 3, 4);
Circle y(2, 3, 5);
assert(x != y);
y = x;
assert(x == y);
}
{
// Circle* const p = new AbstractShape(2, 3); // doesn't compile
AbstractShape* const p = new Circle(2, 3, 4);
p->move(5, 6);
assert(p->area() == 3.14 * 4 * 4);
// assert(p->AbstractShape::area() == 0); // doesn't compile
// assert(p->radius() == 4); // doesn't compile
if (const Circle* const q = dynamic_cast<const Circle*>(p))
assert(q->radius() == 4);
try {
const Circle& r = dynamic_cast<const Circle&>(*p);
assert(r.radius() == 4);}
catch (const bad_cast& e) {
assert(false);}
delete p;
}
{
const AbstractShape* const p = new Circle(2, 3, 4);
const AbstractShape* q = new Circle(2, 3, 5);
assert(*p != *q);
// *q = *p; // doesn't compile
delete q;
q = p->clone();
assert(*p == *q);
delete p;
delete q;
}
/*
{
const Circle a[] = {AbstractShape(2, 3), Circle(4, 5, 6)};
const AbstractShape a[] = {AbstractShape(2, 3), Circle(4, 5, 6)};
assert(a[0].area() == 0);
assert(a[1].area() == 0);
}
*/
{
const Circle a[] = {Circle(2, 3, 4), Circle(5, 6, 7)};
assert(a[0].area() == 3.14 * 4 * 4);
assert(a[1].area() == 3.14 * 7 * 7);
const AbstractShape* const p = a;
assert(p[0].area() == 3.14 * 4 * 4);
// assert(p[1].area() == 3.14 * 7 * 7); // illdefined
}
cout << "Done." << endl;
return 0;}
syntax highlighted by Code2HTML, v. 0.9.1