多态与虚函数的问题
请问下面这两段代码功能一样,但是有什么区别?
第一段代码:
#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;
建议使用第一种方法。