什么是上行/下行?


16

学习多态性时,您通常会看到类似这样的信息

class Base { int prv_member; virtual void fn(){} }
class Derived : Base { int more_data;  virtual void fn(){} }

什么是上流或下流?是(Derived*)base_ptr;上流还是下流?

我之所以称其为“沮丧”,是因为您正在远离基础而进入更具体的领域。其他人告诉我,这很沮丧,因为您将层次结构分解为特定的东西,而顶部是根。但是其他人似乎把它叫做我所说的。

在将基本PTR转换为派生PTR时,它称为上播还是下播?以及是否有人可以链接到官方消息来源或解释其为何如此之称比什么都伟大。



3
这不是重复的。这个问题问是什么,另一个问谁提出了名字。
罗伯特·哈维

1
@RobertHarvey “而且,如果有人可以链接到官方消息来源或解释其原因,那真是太棒了。” ,但也同意,这只能视为问题的一部分
史蒂文·杰里斯

注意派生类中的虚拟对象。除非您再次派生Derived类,否则您不希望编写该代码。void fn(){...}就足够了。
2012年

JustaPro:添加virtual是不必要的,但不会“受伤”。您能否详细说明为什么您认为在这种情况下根本不应该使用它?
Nik Bougalis,2012年

Answers:


17
Is (Derived*)base_ptr; an upcast or downcast?

这是一个令人沮丧的事情:请参阅Wikipedia上的文章

面向对象的编程中向下转换或类型细化是将基类的引用强制转换为其派生类之一的行为。

在许多编程语言中,可以通过RTTI检查所引用对象的类型确实是强制转换为对象的类型还是其派生类型,因此如果不是这种情况,则会发出错误。

换句话说,当基类(父类)的变量具有派生类(子类)的值时,向下转换是可能的...


9

在大多数语言中(据我所知),泛型转换是自动执行的。因此,通常,如果您说的是层次结构中的转换,则是指专门的转换。恕我直言,大多数希望将这两种类型分离的人称其为“专业转换”,因为他们将继承层次结构视为一棵树。在计算机科学中,其根被描绘在最上面。其背后的原因要么是约定,要么是计算机科学家对生物学家的深深仇恨。(所有双关语都有意。)

编辑:也许这是根深蒂固的仇恨。


大声笑必须+1 :)。

2

想一想以树的顶部和底部的叶子作为基础的树的正常绘制方法。如果您以这种方式表示您的类层次结构,将基类放在顶部,将叶子放在下面,那么上下转换就变成了文字-将页面从叶子向上移动到基数的东西是向上的,投稿,而将页面从底部向下移动到叶子的操作是向下转换。


2
但是树木向上,树干从土壤中出来。(这就是为什么我一直认为

@ acidzombie24:但是在计算机科学书籍中,您会发现树通常是按照我的描述绘制的,其根在顶部。
杰里·科芬

我知道,但我只是在笑。树木(真实的树木)和根部(例如地基和脚下的脚)是想到它们的坏方法:(。+1

5
@ acidzombie24:只需将它们视为澳大利亚的树木。
马丁·约克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.