抽象类和多态使用数组 我只是读迈尔斯“更有效的C++ 35新方法”——第33条,他建议在那里。 总是从抽象基类继承,而不是从具体基类继承

抽象类和多态使用数组 我只是读迈尔斯“更有效的C++ 35新方法”——第33条,他建议在那里。 总是从抽象基类继承,而不是从具体基类继承,c++,class,polymorphism,abstract-class,C++,Class,Polymorphism,Abstract Class,他声称的其中一个原因(我不能完全理解)是,通过从抽象类继承,以多态方式处理数组(书中的第3项)不是问题 有人能告诉我这是怎么回事吗 此外,我还想知道,不让客户机实例化另一个派生自的类是否真的总是一件好事?(梅耶斯在书中举例说明了赋值运算符的问题) 按要求编写代码示例: 类BST{…} 类BlanacedBST::public BST{..} 无效打印BST数组(ostream&s,常量BST数组[],整数) { 对于(int i=0;i

他声称的其中一个原因(我不能完全理解)是,通过从抽象类继承,以多态方式处理数组(书中的第3项)不是问题

有人能告诉我这是怎么回事吗

此外,我还想知道,不让客户机实例化另一个派生自的类是否真的总是一件好事?(梅耶斯在书中举例说明了赋值运算符的问题)

按要求编写代码示例:

类BST{…}

类BlanacedBST::public BST{..}

无效打印BST数组(ostream&s,常量BST数组[],整数) { 对于(int i=0;i虽然我认为避免从非抽象类继承是一个很好的设计准则,应该让你对自己的设计三思而后行,但我绝对不认为它属于“永不这样做”的范畴

我要说的是,由于切片问题,设计用于从中继承数据的类可能应该隐藏其赋值运算符

我认为有一种方法可以对不常被想到的类进行分类,我认为这会引起很多混乱。我认为有些类是设计为按值使用的,有些类是设计为总是按引用使用的(通过引用、指针或类似的方式)

在大多数面向对象语言中,用户定义的类只能通过引用使用,还有一类特殊的“基本”类型可以通过值使用。C++的一大优势是,您可以创建用户定义的类,这些类可以通过值使用。这可以带来一些巨大的效率优势。例如,在Java中,您的所有points(选择一个随机的简单类)是堆分配的,需要进行垃圾收集,尽管它们基本上只是两到三个双倍的,并带有一些很好的“最终”支持函数

因此,被设计用来引用的类应该禁用赋值,并且应该认真考虑禁用复制构造,并要求人们为此目的使用“复制这个虚拟函数”。注意java类一般没有赋值操作符或标准复制构造函数。

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


如果您需要将by引用类视为由值使用,则应使用句柄/主体设计模式或智能指针。STL容器都是为由值对象使用而设计的,因此这是一个相当常见的问题。

Meyers没有说您可以毫无问题地创建数组;他说这样会更加困难你应该尝试创建它。一旦你尝试初始化它,编译器就会抱怨,因为如果基类是抽象的,你就不能创建它的对象。

当有人建议你做任何事情时,你可以安全地忽略其余部分。是的,忽略其余部分总是安全的;-)我没有这本书,所以我无法解决你的问题关于这方面的具体问题,尽管我熟悉他关于只使用纯抽象基类的建议。也许你可以粘贴他使用的代码示例?我也不知道如何粘贴。不管怎样,这个问题都会出现。但问题不是试图创建基调用,而是使用基调用作为函数参数,然后将派生类作为参数结束…所以我仍然看不到如何使用is作为抽象帮助。尽管如此,还是可以填充指向基类的指针数组。