基类指针可以指向派生类对象.为什么反之亦然?

Zuz*_*uzu 67 c++

基类指针可以指向派生类对象.如果没有铸造,为什么反之亦然?逻辑上,基类没有足够的派生类信息,但派生类也应该具有基类的信息.我在这里遗漏了一些基础知识.

jk.*_*jk. 134

如果我告诉你我有一只狗,你可以放心地假设我有一只宠物.

如果我告诉你我有一只宠物,你不知道这只动物是狗,它可能是一只猫,甚至可能是一只长颈鹿.在不知道一些额外信息的情况下,你无法安全地假设我有一只狗.

类似地,派生对象是基类对象(因为它是子类),因此它可以由基类指针指向.但是,基类对象不是派生类对象,因此无法将其分配给派生类指针.

(你现在听到的吱吱声是类比拉伸)

假设你现在想给我买一件宠物礼物.

在第一个场景中,你知道它是一只狗,你可以给我带一条皮带,每个人都很开心.

在第二种情况下,我没有告诉你我的宠物是什么,所以如果你打算给我买礼物,你需要知道我没有告诉你的信息(或者只是猜测),你给我买了一条皮带,如果它结果我真的有一只狗每个人都很开心.

然而,如果我真的有一只猫,那么我们现在知道你做了一个糟糕的假设(演员)并且在皮带上有一个不快乐的猫(运行时错误).

ClassCastException Cat

  • +1:到目前为止最好的答案,恕我直言.一个简单的类比,直观地说明了问题. (4认同)
  • 狗是动物,但动物不一定是狗,它可能是长颈鹿.这个类比告诉我什么?如果动物被认为是基类,而狗/长颈鹿是派生类.因为狗/长颈鹿确实是动物,即儿童类应该能够指向基类?那应该不是这样吗? (3认同)
  • "对于每个问题,都有一个简单,整洁,错误的解决方案." - HL Mencken.直观的答案通常属于这一类,特别是在"现实世界"术语中描述的OO.有时基类指针确实指向派生类类型的对象,这就是为什么(如问题所指出的)你可以强制转换的原因. (2认同)

Bil*_*nch 11

我们有两个对象.

class A {
   int a;
};

class B : A {
   int b;
};
Run Code Online (Sandbox Code Playgroud)

分配一个实例B.我们可以将其作为a A*或a 接口B*.

分配一个实例A.如果我们将它投射到a B*,是否应该为该成员分配空间b


Pup*_*ppy 10

呃,因为基类不是派生类.

当你有一个指向某个类型的有效指针时,你就是说指向的对象在某些位置会有某些数据,以便我们可以找到它.如果你有一个指向派生对象的指针,那么你要保证指向的对象包含所有Derived的数据成员 - 但是当你指向Base时,它实际上没有那个和Bad Things Happen™.

但是,Derived保证将所有Base数据成员放在相同的位置.这就是为什么指向Base的指针实际上可以指向Derived.


Jon*_*ood 7

因为派生类包括基类中的所有内容。但是基类不包括派生类中的所有内容。

不建议将基类类型转换为派生类:如果您尝试访问不属于基类的成员会怎样?