一直坚持这个问题,似乎找不到任何答案!
我想拥有基类(图)和一些子库(圆形,三角形等)。然后我想要一个包含不同种类的子类的向量。
问题是,我的所有子类都有大小,但它们以不同的方式描述。
圆圈只需要半径,而三角形需要底边和高度,正方形需要宽度和高度。
这是我的超类
class Figure {
public:
//This function should take diffrent amount of values
virtual void setSize();
//More awesome stuff here
}
这些是示例子类
class Circle {
public:
//This is a circle, only needs radius as size
void setSize( int _radius ) { radius = _radius; }
};
class Triangle {
public:
//This is a triangle, it needs both a base and height
void setSize( int _base, int _height ) { base = _base; height = _height; }
};
所以现在如果我从我的Figure *调用getSize()并指向Circle对象,那么无论如何让我的超类知道它应该调用的Circle类中的setSize(double)吗?
答案 0 :(得分:2)
它就像这样简单:如果你的类没有任何共同的继承,那就不行了。
你期望发生什么?如果我为base->setSize(3)
输入Triangle
,您期望采取什么行为?
如果你可以使用这个参数,你必须简单地覆盖你的子类中的函数。如果你想从这个覆盖版本调用更专业的setSize(int, int)
函数,你可以写:
void setSize(int _radius) {
setSize(_radius, _radius);
}
这只是一个例子,你可以用参数做任何你想做的事情,然后再将它们传递给你更专业的方法。
答案 1 :(得分:0)
警告,警告:如果将派生类存储在矢量中,则会对对象进行切片。请记住,STL使用复制来移动数据成员。因此,如果您有vector<superclass>
并尝试存储子类对象,则STL会将对象的超类部分复制到自己的内存中并保留专门化。
为了解决这个问题,你的第一直觉是使用指向对象的指针并存储指针。这将打开一堆内存泄漏等待发生的蠕虫。解决方案是存储Boost库中的智能指针。我建议你阅读Bjoern Karlsson撰写的“超越C ++标准库 - Boost介绍”。第1章:smart_ptr
与Paranaix一样,我很难想象客户端使用类树接口。在类似的“图”实现中,getSize()类型函数通常返回一个边界框。超类将提供一个虚拟函数Draw()来绘制该边界框内的图形。
正如Pananaix所指出的那样,具有多态函数的想法是函数代表一个狭义的概念,它在派生类中以不同的方式实现。 (这是界面和实现原则的分离)
在您的设计中,客户端必须知道对象的类型才能调用/解释一个函数getSize()的结果。 (对于一个三角形,你要返回/设置边,一个圆是一个半径)这不是要走的路。
我最好的建议是查看您的设计并尝试开发一个界面并针对该界面进行编写。界面工作后,编写实现。
祝你好运。