超类和子类,不同的函数调用取决于子类
Superclass and subclass, diffrent function calls depending on subclass
这个问题困扰了一段时间,似乎找不到任何答案!
我想要基类(图)和一些子类(圆、三角形等)。然后我想要一个向量来包含不同类型的子类。
问题是,我所有的子类都有大小,但它们的描述方式不同。
圆形只需要半径,三角形需要底和高,正方形需要宽和高。
这是我的超类
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)?
就这么简单:如果你的类没有任何共同点,那么继承就无法工作。你预计会发生什么?如果我为Triangle
输入base->setSize(3)
,您期望什么行为?
如果您可以使用这个参数,那么您只需覆盖子类中的函数即可。如果你想从这个替代版本调用更专业的setSize(int, int)
函数,你可以写:
void setSize(int _radius) {
setSize(_radius, _radius);
}
当然,这只是一个例子,在将参数传递给更专业的方法之前,您可以对参数执行任何您想要的操作。
警告,警告:如果将派生类存储在向量中,则会对对象进行切片。请记住,STL使用复制来移动数据成员。因此,如果你有一个vector<superclass>
,并试图存储一个子类对象,STL会将对象的超类部分复制到它自己的内存中,并留下你的专长。
为了解决这个问题,你的第一反应是使用指向对象的指针并存储该指针。这将打开一个内存泄漏等待发生的蠕虫罐头。解决方案是存储Boost库中的智能指针。我建议你阅读比约恩·卡尔松的《超越C++标准库——Boost简介》。第1章:smart_ptr
像Paranaix一样,我在设想客户端使用类树接口时遇到了一些困难。在类似类型的"Figure"实现中,getSize()类型的函数通常返回一个边界框。超类将提供一个虚拟函数Draw()来绘制边界框内的图形。
正如Pananaix所指出的,多态函数的思想是,函数代表一个狭义的概念,它在派生类中以不同的方式实现。(这是接口和实现原理的分离)
在您的设计中,客户端必须知道对象的类型,才能调用/解释一个函数getSize()的结果。(对于一个三角形,你要返回/设置边,对于一个半径为圆)这不是办法。
我最好的建议是看看你的设计,试着开发一个接口,并根据这个接口进行编写。一旦接口工作正常,就编写实现。
祝你好运。
- 由于签名差异,调用了错误的子类函数
- 从父类的向量访问子类函数,而无需向下转换
- 在子类函数覆盖中省略具有默认值的参数
- 有没有办法在C++中调用基类的所有子类函数?
- 从多重继承中的派生类函数调用适当的父类函数
- 在子类上调用模板化静态方法时获取类的类型名
- 无法调用子类函数,C++
- 子类作为模板模板基类的模板参数,而该类别又是子类函数参数
- 从同一父调用调用不同的子类函数
- 在子类函数中访问超类友元的受保护数据成员
- 调用子类函数
- 相对于更专业的继承函数,模板更喜欢子类函数
- 尝试在 C++ 中的子类中调用父类的受保护函数
- 重载的子类函数,将子类的实例作为参数,如何使用
- 在子类中调用父函数
- 调用超类上不存在的子类函数
- C++在子类内部调用基类构造函数
- 遗产.从父类调用子类函数
- 子类如何调用以不同方式初始化成员变量的父类的构造函数?[C++]
- 在C++QObject子类中调用析构函数之前执行操作