【问题标题】:comparing pointer to base type with derived type's pointer将指向基类型的指针与派生类型的指针进行比较
【发布时间】:2013-10-12 11:10:24
【问题描述】:

假设有一个基类 B 和派生类 D1、D2、D3。

B* b;
D1 d1;
D2 d2;
D2 *pd2 = &d2;
D3 d3;
//more code placing valid data on variables

可以在代码中的某处说b = &d1b = pd2。 现在是否可以在没有动态转换的情况下将 b 与指向 d1、d2 和 d3 的指针进行比较以获得指针的相等性?也就是说,我可以这样做吗:

if (b == &d1)
{
//do something
}

?

【问题讨论】:

  • b = pd2 是不可能的,可能你的意思是b = &pd2
  • @GrijeshChauhan pd2 是一个指针,以防你错过它。
  • @Akilan 你应该叫它pb 而不是b..
  • @Adam 是的;在您发表评论之前没有意识到。现在无法更改,因为它会混淆答案和 cmets。

标签: c++ pointers polymorphism


【解决方案1】:

现在是否可以将 b 与指向 d1、d2 和 d3 的指针进行比较,以获得指针的相等性,而无需动态转换?

是的。

if (b == pd2) 可以很好地判断 bpd2 是否指向同一个对象。

【讨论】:

    【解决方案2】:

    if (b == &d1) 将简单地比较指针地址,除非创建了基于对象中存储的信息进行比较的运算符重载。

    附带说明,您不能根据您的代码执行b = pd2,除非您在一个或两个对象中正确重载运算符,或者改用b = &pd2

    【讨论】:

    • 是的,它不是深度比较。
    • 我不想比较存储在两个对象中的信息。我想比较两个指针是否指向同一个对象。只有其中一个指针是基类的类型。
    • 您不能在内置类型上定义重载运算符,因此第一句的后半部分不适用。 if (b == &d1) 只是比较两个指针的值。总是。
    • @bizzehdee 没关系,这不是 OP 想要的,但是“除非创建了运算符重载”是不可能的。您不能重载指针运算符。两个操作数之一必须是类或枚举。
    猜你喜欢
    • 2014-06-16
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多