C++ 什么是横向指针投射?

C++ 什么是横向指针投射?,c++,pointers,multiple-inheritance,C++,Pointers,Multiple Inheritance,我在Horstmann的核心Java第1卷中遇到了这一点: C++具有多重继承和所有随之而来的复杂性,如虚拟基类、支配规则和横向指针强制转换 核心爪哇岛第一卷:基础[Horstmann,Cay S.2016普伦蒂斯大厅第十版第6.1.3节,第297页] 现在,我熟悉另外两个,但是什么是横向指针投射?它是将指向基类的指针强制转换为派生类的术语吗?我以前从未见过这个术语,但我认为这是交叉转换的另一个名称,当您需要在继承图上强制转换(而不是“向上”或“向下”)时。以以下情况为例: // V-shape

我在Horstmann的核心Java第1卷中遇到了这一点:

C++具有多重继承和所有随之而来的复杂性,如虚拟基类、支配规则和横向指针强制转换

核心爪哇岛第一卷:基础[Horstmann,Cay S.2016普伦蒂斯大厅第十版第6.1.3节,第297页]


现在,我熟悉另外两个,但是什么是横向指针投射?它是将指向基类的指针强制转换为派生类的术语吗?

我以前从未见过这个术语,但我认为这是交叉转换的另一个名称,当您需要在继承图上强制转换(而不是“向上”或“向下”)时。以以下情况为例:

// V-shaped inheritance graph

// [ Base1 ]   [ Base2 ]
//      \         /
//       \       /
//      [ Derived ]

struct Base1 { };
struct Base2 { };
struct Derived : Base1, Base2 { };

// ...

// Take an object of derived type
Derived d;

// Upwards conversion, we get its Base1 subobject
Base1 *b1 = &d;
现在假设我们只有静态类型
Base1
和动态类型
Derived
b1
,并且我们想要到达
Base2
子对象,也就是说,在V的分支之间转换

问题是,我们丢失了
*b1
实际上是
派生的
的子对象的信息。它可以是任何其他类的子对象,也可以是自己的对象。我们必须使用以下两种工具之一:

// If we know by other means that b1 is for sure a Derived,
// walk the graph explicitly through Derived
Base2 *b2 = /* implicit upwards conversion */ static_cast<Derived*>(b1);

// If Base1 is polymorphic (i.e. has at least one virtual function)
// Let RTTI do the job and check for errors. Slower but safer.
Base2 *b2 = dynamic_cast<Base2 *>(b1);
//如果我们通过其他方式知道b1肯定是派生的,
//显式地遍历图
Base2*b2=/*隐式向上转换*/静态转换(b1);
//如果Base1是多态的(即至少有一个虚拟函数)
//让RTTI完成工作并检查错误。速度较慢但更安全。
Base2*b2=动态_铸造(b1);

我以前从未见过这个术语,但我认为这是交叉转换的另一个名称,当您需要转换继承图时(而不是“向上”或“向下”)。以以下情况为例:

// V-shaped inheritance graph

// [ Base1 ]   [ Base2 ]
//      \         /
//       \       /
//      [ Derived ]

struct Base1 { };
struct Base2 { };
struct Derived : Base1, Base2 { };

// ...

// Take an object of derived type
Derived d;

// Upwards conversion, we get its Base1 subobject
Base1 *b1 = &d;
现在假设我们只有静态类型
Base1
和动态类型
Derived
b1
,并且我们想要到达
Base2
子对象,也就是说,在V的分支之间转换

问题是,我们丢失了
*b1
实际上是
派生的
的子对象的信息。它可以是任何其他类的子对象,也可以是自己的对象。我们必须使用以下两种工具之一:

// If we know by other means that b1 is for sure a Derived,
// walk the graph explicitly through Derived
Base2 *b2 = /* implicit upwards conversion */ static_cast<Derived*>(b1);

// If Base1 is polymorphic (i.e. has at least one virtual function)
// Let RTTI do the job and check for errors. Slower but safer.
Base2 *b2 = dynamic_cast<Base2 *>(b1);
//如果我们通过其他方式知道b1肯定是派生的,
//显式地遍历图
Base2*b2=/*隐式向上转换*/静态转换(b1);
//如果Base1是多态的(即至少有一个虚拟函数)
//让RTTI完成工作并检查错误。速度较慢但更安全。
Base2*b2=动态_铸造(b1);

也许你不应该从java人的C++中学习C++。也许你不应该从java人的咆哮中学习C++。