我有这个变量;家具**家具; 这是2个子类,Bookcase和Couch的抽象基类。我随机添加这些;
furnitures[n++] = new Bookcase ();
furnitures[n++] = new Couch();
.
.
为了解释。让我们设置一些小变量。 私人家具:名称,奖品 书柜私密:大小 沙发私人:座位
如果我想打印出诸如此类的信息,我该怎么办?姓名和席位?
此问题存在各种问题。 1,区分哪个子类是什么时候我使用Furniture [i]。 2,我不想在两个不需要的子类之间混合太多不必要的函数。
答案 0 :(得分: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;
}
答案 1 :(得分:0)
你应该从不以多态方式使用数组。阅读Scott Meyers的更有效的C ++ 书中的第一项(我认为这是第一项),找出原因!
实际上,你几乎不应该在C ++中使用原始数组。正确的解决方案是使用std::vector<Furniture*>
。
如果我想打印出诸如此类的信息,我该怎么办? 姓名和席位?
此问题存在各种问题。 1,区分哪个 子类是我使用Furniture [i]的时候。 2,我也不想混合 两个子类之间没有多少不必要的函数 需要..
您正面临这个问题,因为您正在滥用面向对象的编程。这很简单:当不同类型实现抽象常用操作并且在运行时选择具体类型时,面向对象编程是有意义的。在您的情况下,没有共同的操作。打印(或接收)数字座位是一种类型,打印(或接收)尺寸是另一种类型。
这并不是说这是坏事还是错误,但它根本不是面向对象的。
现在C ++不会是C ++,如果它没有为你提供一个危险的工具来摆脱你自己编码的每一个死胡同。在这种情况下,您可以使用运行时类型标识(RTTI)来查找对象的具体类型。 Google typeid
和dynamic_cast
,您很快就会找到解决方案。但请记住,使用RTTI解决此问题的方法是解决方法。检查您的课程设计,并在必要时进行更改。