| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 529 人关注过本帖
标题:求指教:这段代码的执行过程
只看楼主 加入收藏
zpcdbc
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2014-6-7
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
求指教:这段代码的执行过程
请高人帮忙分析一下以下代码的执行过程,希望尽量详细一点,在下不胜感激!
#include <iostream>
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;
}
对于您的热心解答,在下先行谢过!
搜索更多相关主题的帖子: 不胜感激 include public return 
2014-06-12 15:05
律吕调阳
Rank: 2
等 级:论坛游民
威 望:2
帖 子:16
专家分:93
注 册:2014-6-9
收藏
得分:20 
Shape * p1=new Circle(2.5);        --------》动态绑定(在指针和有引用的时候前提是基类有虚函数或者纯虚函数时
 如果不在乎到虚函数表的话,我们暂且认为,p1就是Circle的对象当然肯定不是Circle的对象,方便理解,你以后慢慢学到就知道怎么回事了)
    p1->Area();                        -------》调用子类的Area函数  按上面说的P1现在看成是Circle的对象不调用自己的函数还调用谁的

    Shape * p2=new Rectangle(5,11);
    p2->Area();
                ------------------------    同上
    Shape *p3=p1->Clone();
    p3->Area();
            ---------------------》 return new Circle(*this)  这个会调用拷贝构造函数   这里的*this  就是P1这个对象  而p1是Clone类型的
            所以先调用拷贝构造,然后是调用Circle的Area()函数
    Shape *p4=p2->Clone();
    p4->Area();

    delete p4;
    delete p3;
    delete p2;
    delete p1;
2014-06-12 17:59
zpcdbc
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2014-6-7
收藏
得分:0 
非常感谢您的耐心解答!对于您的解答,我十分满意,您说的我基本上都看懂了,只是还有一点小小的疑问想向您请教。
1)关于下面的代码,我们老师讲的时候(当然不是具体这道题)是这样说的:
Shape * p1=new Circle(2.5);  //派生类向基类转化,p1的确是指向Shape类的
p1->Area();   //执行这句时,现在Shape类中找Area函数,有,但是是虚的,于是在虚函数表中找到运行时的area函数,即Circle类的Area函数,执行。
请问:
我的解释对吗?这和您说的动态绑定是一致的吗?
2)关于
Shape *p3=p1->Clone();
p3->Area();
还是不太懂,它和
Shape * p1=new Circle(2.5);
p1->Area();
有什么本质上的区别?
还有,你的解答中说“这里的*this  就是P1这个对象  而p1是Clone类型的”,p1怎么是Clone类型的,在下觉得p1也是Shape(确切说是Shape*)类型的。
求您的解释。
如果您有时间,热切盼望得到您的解答。


2014-06-14 08:50
快速回复:求指教:这段代码的执行过程
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026079 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved