【发布时间】:2017-10-12 21:35:08
【问题描述】:
在尝试学习多态性时,我对一件事感到困惑。考虑以下情况:
存在基类Shape 和派生类Circle 和Square。通过多态性,我可以在基类中将方法get_area 实现为虚函数,并在派生类Circle 和Square 中实现该函数的各个版本。
class Shape
{
public:
Shape(){}
virtual int get_area() = 0;
};
class Square: public Shape
{
public:
Square(int width, int height)
{
// stuff
}
int get_area()
{
return width*height;
}
};
class Circle: public Shape
{
public:
Circle(int radius)
{
// stuff
}
int get_area()
{
return pi*radius*radius;
}
};
int main ()
{
Shape *circle= new Circle(3);
Shape *square= new Square(4,5);
return 0;
}
但是如果我需要在其中一个派生类中实现一个单独的方法,例如get_radius。如果此方法未在基类中作为虚函数实现,我会从编译器收到错误消息。但是如果我这样做,我还必须在派生类Square 中实现方法get_radius,这没有任何意义,因为正方形没有半径。
有没有更好的方法来解决这个问题?谢谢。
【问题讨论】:
-
您绝对可以只将
get_radius方法添加到Circle。您能否分享有问题的代码和您遇到的错误? -
错误 C2039: 'get_radius': 不是 'Shape' 的成员
-
没有那个错误的代码那是没用的。此外,即使我能猜到它的意思,它在英语中会更有用。
-
你可以在你的派生类中有不同的非虚函数,但是你不能从基类指针调用它们。
-
如果你有
Shape,你不知道它是Circle、Triangle还是Square。为什么你认为你可以打电话给get_radius呢?如果你知道你有一个Circle,你绝对可以调用get_radius,你只需要使用正确的类型:Circle* circle = ...。
标签: c++ class oop polymorphism