c – 如何将子类指针严格地等于父类指针?

c – 如何将子类指针严格地等于父类指针?,第1张

概述我在两种智能指针之间编写了一个运算符==,并认为我应该进行快速的健全性检查.我对结果感到惊讶…… 在下面的代码片段中,f和b的所有变体如何以相同的值结束? struct Foo { int x;};struct Bar : public Foo { int y;};#include <iostream>int main (){ Bar bar; 我在两种智能指针之间编写了一个运算符==,并认为我应该进行快速的健全性检查.我对结果感到惊讶……

在下面的代码片段中,f和b的所有变体如何以相同的值结束?

struct Foo {    int x;};struct bar : public Foo {    int y;};#include <iostream>int main (){    bar bar;    Foo * f = &bar;    bar * b = &bar;    std :: cout << f << " " << b << " " << (f == b) << "\n";    voID * fv = f;    voID * bv = b;    std :: cout << fv << " " << bv << " " << (fv == bv) << "\n";    int fi = reinterpret_cast <int> (f);    int bi = reinterpret_cast <int> (b);    std :: cout << fi << " " << bi << " " << (fi == bi) << "\n";}
解决方法 关于基类对象与其子类对象不具有相同地址的唯一时间是涉及多重继承时.

在上面的示例中,内存可能如下所示:

                               / --------- \                              /  | x     |  > This is the Foo portion of barThis is the whole bar object <   --------- /                                \  | y     |                                 \ ---------  

对象的两个视图具有相同的起点,因此指向任一视图的指针将具有相同的值.

在多重继承中,事情变得更加复杂.说你有:

struct Foo1{ int x; };struct Foo2{ int y; };struct bar : public Foo1,public Foo2 { int z; };bar bar;

现在记忆必须像这样:

                                / --------- \                               /  | x     |  > This is the Foo1 portion of bar                              /   --------- / \ This is the whole bar object <    | y     |    > This is the Foo2 portion of bar                                \   ---------   /                               \  | z     |                                  \ ---------  

因此& bar和(Foo1 *)& bar将具有相同的值,而(Foo2 *)& bar将具有不同的值,因为对象的Foo2部分从更高的地址开始.

总结

以上是内存溢出为你收集整理的c – 如何将子类指针严格地等于父类指针?全部内容,希望文章能够帮你解决c – 如何将子类指针严格地等于父类指针?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1255908.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存