首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

多态与虚函数的有关问题

2012-03-09 
多态与虚函数的问题请问下面这两段代码功能一样,但是有什么区别?第一段代码:#includestdafx.h #include

多态与虚函数的问题
请问下面这两段代码功能一样,但是有什么区别?

第一段代码:
#include   "stdafx.h "
#include   "iostream.h "

class   Cshape
{
      public:
            virtual   double   getArea()
            {
                  return   0;
            }
            virtual   double   getGirth()
            {
                  return   0;
            }

};

class   Csquare   :   public   Cshape
{
      publc:
            float   m_side;
            Csquare()
            {
                    m_side=0;
            }
            double   getArea()
            {
                    return   m_side*m_side;
            }
            double   getGirth()
            {
                    return   m_side*4;
            }
};

class   Circle   :   public   Cshape
{
      public:
            float   m_radius;
            Circle()
            {
                  m_radius=0;
            }      
            double   getArea()
            {
                  return   m_radius*m_radius*3.14;
            }
            double   getGirth()
            {
                  return   2*m_radius*3.14;
            }

};

double   interfacegetArea(Cshape   &   shape)
{
            return   shape.getArea();
}

double   interfacegetGirth(Cshape   &   shape)
{
            return   shape.getGirth();
}

int   main()
{
            Csquare   squa;
            Circle   cir;
            count < < "输入正方形的边长: ";
            cin> > squa.m_side;
            count < < "输入圆形的半径: ";
            cin> > cir.m_radius;
            count < < "正方形的面积为: " < <interfacegetArea(squa) < <endl;


            count < < "正方形的边长为: " < <interfacegetGirth(squa) < <endl;
            count < < "圆形的面积为: " < <interfacegetArea(cir) < <endl;
            count < < "圆形的边长为: " < <interfacegetGirth(cir) < <endl;
            return   0;
}
第二段代码:
#include   "stdafx.h "
#include   "iostream.h "

class   Cshape
{
      public:
            virtual   double   getArea()
            {
                  return   0;
            }
            virtual   double   getGirth()
            {
                  return   0;
            }

};

class   Csquare   :   public   Cshape
{
      publc:
            float   m_side;
            Csquare()
            {
                    m_side=0;
            }
            double   getArea()
            {
                    return   m_side*m_side;
            }
            double   getGirth()
            {
                    return   m_side*4;
            }
};

class   Circle   :   public   Cshape
{
      public:
            float   m_radius;
            Circle()
            {
                  m_radius=0;
            }      
            double   getArea()
            {
                  return   m_radius*m_radius*3.14;
            }
            double   getGirth()
            {
                  return   2*m_radius*3.14;
            }

};


int   main()
{
            Csquare   squa;
            Circle   cir;
            count < < "输入正方形的边长: ";
            cin> > squa.m_side;
            count < < "输入圆形的半径: ";
            cin> > cir.m_radius;
            count < < "正方形的面积为: " < <squa.getArea() < <endl;


            count < < "正方形的边长为: " < <squa.getGirth() < <endl;
            count < < "圆形的面积为: " < <cir.getArea() < <endl;
            count < < "圆形的边长为: " < <cir.getGirth() < < < <endl;
            return   0;
}




[解决办法]
使用第一种方式更能体现多态的特性,
double interfacegetArea(Cshape & shape)
{
return shape.getArea();
}
函数形参使用基类,调用的时候可以使用不同的派生类Csquare或Circle,执行shape.getArea();的时候能根据不同的派生类调用对应的方法(传递Csquare则调用Csquare.getArea(),传递Circle则调用Circle.getArea()),这样就保证了函数接口一致,而调用的方法则根据基类指针指向的类型而不是基类的类型来定。

使用第二种方法也可以执行,不过不能很好的体现多态的特点,因为在调用的时候已经写死了
count < < "正方形的面积为: " < <squa.getArea() < <endl;
count < < "正方形的边长为: " < <squa.getGirth() < <endl;
count < < "圆形的面积为: " < <cir.getArea() < <endl;
count < < "圆形的边长为: " < <cir.getGirth() < < < <endl;
建议使用第一种方法。

热点排行