抽象类和多态使用数组

Posted

技术标签:

【中文标题】抽象类和多态使用数组【英文标题】:abstract class and using array polymorphically 【发布时间】:2009-12-12 15:02:53 【问题描述】:

我正在阅读 meyers “更有效的 C++ 35 种新方法”——第 33 项,他在此提出建议 总是从抽象基类继承,而不是具体的。

他声称的其中一个原因(我不太明白)是从抽象类继承,多态处理数组(书中的第 3 项)不是问题。

有人可以建议这是怎么回事吗?

此外,我想知道永远不要让客户端实例化其他派生的类是否真的总是一件好事? (例如,meyers 在他的书中展示了赋值运算符的问题)

请求的代码示例:

类 BST .... ;

CLASS BlanacedBST:: 公共 BST ....

void printBSTArray(ostream& s, const BST array[],int Numelements) for(int i=0;i

BST BSTArray[10]; printBSTArray(BSTArray); // 工作正常

BlanacedBST bBSTArray[10]; printBSTArray(bBSTArray); // 未定义的行为(因为下标运算符根据 BST 块大小使指针前进)

然后,他补充说,避免从另一个 concreat 类 (BST) 继承的 concreate 类 (BlanacedBST) 通常可以避免这个问题 - 这我不明白。

【问题讨论】:

当有人建议做任何事情总是从不你可以放心地忽略其余的。 是的,忽略其余部分总是是安全的 ;-) 我没有这本书,所以我无法解决您在这方面的具体问题,尽管我熟悉他关于仅使用纯抽象基类的建议。也许您可以粘贴他使用的代码示例? 我也不明白。无论如何,这个问题应该会出现。 【参考方案1】:

虽然我认为避免从非抽象类继承是一个很好的设计准则,并且应该让您对自己的设计三思而后行,但我绝对不认为它属于“永远不要这样做”的范畴。

我会说,由于切片问题,设计为继承自其中包含数据的类可能应该隐藏它们的赋值运算符。

我认为有一种方法可以对不经常想到的类进行分类,我认为这会引起很多混乱。我认为有些类被设计为按值使用,有些类被设计为始终按引用使用(意味着通过引用或指针或类似的东西)。

在大多数面向对象的语言中,用户定义的类只能通过引用使用,并且有一个特殊的“原始”类型可以按值使用。 C++ 的一大优势是您可以创建可以按值使用的用户定义类。这可以带来一些巨大的效率胜利。例如,在 Java 中,您的所有点(选择一个随机的简单类)都是堆分配的,需要进行垃圾收集,即使它们基本上只是两个或三个双精度数,并带有一些不错的“最终”支持功能。

因此,设计为通过引用使用的类应禁用赋值,并应认真考虑禁用复制构造,并要求人们为此目的使用“复制此”虚函数。请注意,Java 类通常没有赋值运算符或标准复制构造函数之类的东西。

设计为按值使用的类通常不应具有虚函数,尽管将它们作为继承层次结构的一部分可能非常有用。它们仍然可能相当复杂,因为它们可以包含对设计为通过引用使用的类的对象的引用。

如果您需要将按引用类视为按值使用,则应使用句柄/主体设计模式或智能指针。 STL 容器都是为值对象设计的,所以这是一个相当普遍的问题。

【讨论】:

【参考方案2】:

Meyers 并不是说​​你可以毫无问题地创建数组;他说你尝试创造它会更加困难。一旦你尝试初始化它,编译器就会报错,因为如果它是抽象的,你就不能创建基类的对象。

【讨论】:

但事情不是试图创建基本调用,而是使用基本调用作为函数参数,并将派生类作为参数发送......所以我仍然看不到如何使用就像抽象一样有帮助 但是,可以填充指向基类的指针数组。

以上是关于抽象类和多态使用数组的主要内容,如果未能解决你的问题,请参考以下文章

抽象类和接口

抽象类和抽象方法接口和多态

Dart抽象类和多态

多态学习续 抽象类和接口

Java抽象类和多态

抽象类和接口的区别与联系