[英]c++ Using subclasses
我有这个变量; 家具**家具; 这是2个子类,Bookcase和Couch的抽象基类。 我随机添加这些;
furnitures[n++] = new Bookcase ();
furnitures[n++] = new Couch();
.
.
为了解释。 让我们设置一些小变量。 私人家具:名称,奖项私人书柜:大小沙发私人:座位
如果我想打印出诸如此类的信息,我将如何进行; 名字和座位?
这个问题有很多问题。 1,区分哪个子类是什么时候我使用Furniture [i]。 2,我不想在不需要的两个子类之间混合太多不必要的函数。
class Furniture
{
virtual void output() = 0;
};
class Couch : public Furniture
{
void output() override;
};
class Bookshelf : public Furniture
{
void output() override;
};
您可以在Furniture中定义函数以从子类中的重复代码中保存,如下所示:
void Furniture::output()
{
// We assume here the output is to cout, but you could also pass the necessary
// stream in as argument to output() for example.
cout << name << price;
}
void Couch::output()
{
Furniture::output();
cout << seats;
}
void Bookshelf::output()
{
Furniture::output();
cout << size;
}
你永远不应该以多态方式使用数组 。 阅读Scott Meyers的“ 更有效的C ++”一书中的第一项(我认为这是第一项),找出原因!
事实上,你几乎不应该在C ++中使用原始数组。 一个正确的解决方案是使用std::vector<Furniture*>
。
如果我想打印出诸如此类的信息,我将如何进行; 名字和座位?
这个问题有很多问题。 1,区分哪个子类是什么时候我使用Furniture [i]。 2,我不想在两个不需要的子类之间混合太多不必要的函数。
您正面临这个问题,因为您正在滥用面向对象的编程。 这很简单:当不同类型实现抽象公共操作并且在运行时选择具体类型时,面向对象编程是有意义的。 在您的情况下,没有共同的操作。 打印(或接收)数字座位是一种类型,打印(或接收)的尺寸是另一种类型。
这并不是说这是坏事还是错误,但它根本不是面向对象的。
现在C ++不会是C ++,如果它没有为你提供一个危险的工具来摆脱你自己编码的每一个死胡同。 在这种情况下,您可以使用运行时类型标识(RTTI)来查找对象的具体类型。 谷歌的typeid
和dynamic_cast
,你会很快找到解决方案。 但请记住,使用RTTI解决此问题是一种解决方法 。 检查您的课程设计,并在必要时进行更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.