2 zpcdcsdn zpcdcsdn 于 2014.06.12 15:24 提问

请高人指点一下这段代码的执行过程,不胜感激

请您帮忙分析一下以下代码的执行过程,在下在编译器上跑了一遍,可还是不太明白,希望能得到您的详尽的解释,谢谢!
#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个回答

u010581575
u010581575   2014.06.12 19:32

执行过程分析:
1.对于p1,作为向上造型父类的指针,它可以接受子类的对象,所以p1->Area()会输出子类的面积
2.对于p2,道理如上,输出的是子类矩形的面积
3.对于p3,是调用一个指针所指向类的函数的返回值,这个返回值指向了一个对象,这个对象根据p2或者p1来区分,p3指向的是p1所调用的函数,所以是圆的面积,p1在clone函数中会new一个新的对象,根据所传参数类型为指针,会选用相关的重载构造器,所以会输出“copy construct circle”这句话,最后调用area会输出相应的圆的面积
4.对于p4,道理如上所示
5.最后注意对象的删除过程,先删除子类指针,再删除父类指针
6.希望对你有用

zpcdcsdn
zpcdcsdn 即纯虚函数的事情。对于您的解答在下不胜感激!
3 年多之前 回复
zpcdcsdn
zpcdcsdn virtual Shape * Clone() const=0;
3 年多之前 回复
zpcdcsdn
zpcdcsdn virtual float Area() const=0;
3 年多之前 回复
zpcdcsdn
zpcdcsdn 您的回答对我帮助很大,非常感谢!如果您有时间的话,请您帮我解释一下代码Shape类中的这两行
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!