![]() |
1
8
如果您的类确实与给定的完全相同,那么就不可能了,因为在运行时没有足够的信息来重建所需的信息。
如果它们实际上是具有虚拟函数的多态类,听起来就像
见第7段: http://www.csci.csusb.edu/dick/c++std/cd2/expr.html#expr.dynamic.cast
我怀疑通常
恐怕这不是我自己使用过的一个功能,但我经常看到有人建议它,我推断它得到了广泛的支持,并且可以像广告中那样工作。 |
![]() |
2
3
没有一般的方法。一般来说,基类子对象不知道它们是什么,所以如果您只有一个指向基类子对象的指针,那么如果您事先不知道后者的类型,您就没有任何方法来获取指向它所属的最派生对象的指针。 让我们从这个开始:
考虑内存布局的典型实现
您有两个指针:
每个指针有效地指向一个
|
![]() |
3
3
有一个简单的方法和一个困难的方法。 简单的方法是引入一个空的虚拟基类。从此类继承的每个对象都会得到指向“real”对象中公共点的指针,这正是您想要的。指针有一点开销,但没有分支或任何东西。
最困难的方法是尝试使用模板。这里已经有一些黑客了。当使用模板进行黑客攻击时,请记住您实际上是在重新设计语言的一部分,只是希望通过管理编译时信息来降低开销。我们可以降低虚拟基类的开销并消除该指针吗?这取决于你需要多少概括性。如果您的基类可以在一个派生对象中以几种不同的方式排列,那么在编译时肯定会有一些您无法获得的信息。 但是如果您的继承层次结构是一个颠倒的树(即,您通过大量的多个继承来构建大型对象),或者是多个这样的树,那么您只需继续并将指针强制转换为最派生的类型,如:
当然,您不想将空指针传递给这个“优化”版本。 |
![]() |
4
1
除了智能指针(实际上不是指针,而是类对象)之外,重载
当然,比较不同类型的指针可能不起作用。你为什么认为你需要这么做? |
![]() |
5
0
所以,您需要一个编译时解决方案。我不相信这是可能的,正如C++中所说的那样。下面是一个思想实验: 文件Bases.hpp:
文件派生.hpp:
文件composite.hpp:
文件randomreturn.cpp:
现在,假设您有:
我们怎么可能实现
另一方面,如果你愿意改变假设,它应该是可行的:
|
![]() |
6
0
使用
|
![]() |
7
0
如果需要比较对象的身份,为什么不给它们一个呢?毕竟,这是 你 谁来决定物体的身份。让编译器来做这件事,你就会受到编译器的限制。 在某种程度上…
|
![]() |
8
-1
你的方法对我有效,即使在你引用的案例中:
此处打印“等号”。 |
![]() |
9
-2
您可以检查指向内存中是否重叠的对象(从MarkRansom的答案中窃取)。这将调用未定义的行为,但应在任何合理的编译器上执行所需的操作:
|
![]() |
charliezz10 · OAuth 2.0-自己网站的帐户管理 7 年前 |
![]() |
RezaNoei · 如何在ASP中限制用户只能访问一个令牌。网络标识 7 年前 |
![]() |
lumo · 如何使用标识列ddl表 7 年前 |
![]() |
Brian · 中的多租户授权。NET Core 2.0:如何 7 年前 |
![]() |
Heinzi · 服务器端仅向前游标中断@标识 7 年前 |