我正在做一个Shape类,它允许你获得某个形状的positionX,positionY和区域.派生类是一个Circle,它有一个附加的radius变量.
class Shape
{
public:
Shape( double positionX, double positionY );
virtual double getPositionX() = 0;
virtual double getPositionY() = 0;
virtual double area() = 0;
class Circle : public Shape
{
public:
Circle( double positionX, double positionY, double radius );
virtual double getPositionX();
virtual double getPositionY();
virtual double area();
virtual double getRadius();
Run Code Online (Sandbox Code Playgroud)
在我的主要部分中,我有一个Shapes数组,第一个对象是一个新的Circle,我在这个Circle上调用方法.
int main()
{
Shape* s[2];
s[0] = new Circle( 2.0, 3.0, 4.0 );
cout << s[0]->getPositionX() << endl; // Works fine.
cout << s[0]->getPositionY() << endl; // Works fine.
cout << s[0]->getRadius() << endl; // Doesn't work because s is a shape and my shape class has
// no getRadius() method.
Run Code Online (Sandbox Code Playgroud)
如何调用getRadius()方法?
Ug ...一个好的设计完全避免了这一点.如果你需要得到某个东西的半径,那么它最好能够提供一个半径.如果形状是三角形,你的程序应该怎么做?
现在解决这个问题的方法是使用动态强制转换:
Circle* circ = dynamic_cast<Circle*>(s[0]);
if (circ)//check if cast succeeded
{
cout << circ->getRadius() << endl;
}
Run Code Online (Sandbox Code Playgroud)
但这段代码闻起来.一般来说,如果你必须使用dynamic_cast(这很慢而且很混乱)那么你应该重新考虑你的设计.