请您帮忙分析一下以下代码的执行过程,在下在编译器上跑了一遍,可还是不太明白,希望能得到您的详尽的解释,谢谢!
#include
using namespace std;
class Shape
{
public:
Shape(){}
virtual ~Shape() {}
virtual float Area() const=0;
virtual Shape * Clone() const=0;
};
class Circle:public Shape
{
public:
Circle(float r):radius(r) {}
virtual ~Circle() {}
virtual float Area() const
{
cout<<"Circle's Area ="<<radius*radius*3.1415926<<endl;
return radius*radius*3.1415926f;
}
virtual Circle * Clone() const {return new Circle(*this); }
private:
Circle(const Circle& rhs)
{
cout<<"Copy Construct Circle!"<<endl;
radius=rhs.radius;
}
private:
float radius;
};
class Rectangle:public Shape
{
public:
Rectangle(float w,float h):width(w),height(h) {}
virtual ~Rectangle() {}
virtual float Area() const
{
cout<<"Rectangle's Area ="<<width*height<<endl;
return width*height;
}
virtual Rectangle * Clone() const {return new Rectangle(*this); }
private:
Rectangle(const Rectangle& rhs)
{
cout<<"Copy Construct Rectangle!"<<endl;
width=rhs.width;height=rhs.height;
}
private:
float width;
float height;
};
int main(int argc, char* argv[])
{
Shape * p1=new Circle(2.5);
p1->Area();
Shape * p2=new Rectangle(5,11);
p2->Area();
Shape *p3=p1->Clone();
p3->Area();
Shape *p4=p2->Clone();
p4->Area();
delete p4;
delete p3;
delete p2;
delete p1;
return 0;
}
对于您的热心帮助,在下先行谢过!
执行过程分析:
1.对于p1,作为向上造型父类的指针,它可以接受子类的对象,所以p1->Area()会输出子类的面积
2.对于p2,道理如上,输出的是子类矩形的面积
3.对于p3,是调用一个指针所指向类的函数的返回值,这个返回值指向了一个对象,这个对象根据p2或者p1来区分,p3指向的是p1所调用的函数,所以是圆的面积,p1在clone函数中会new一个新的对象,根据所传参数类型为指针,会选用相关的重载构造器,所以会输出“copy construct circle”这句话,最后调用area会输出相应的圆的面积
4.对于p4,道理如上所示
5.最后注意对象的删除过程,先删除子类指针,再删除父类指针
6.希望对你有用