派生类和基类之间指针到指针的转换?

Conversion of pointer-to-pointer between derived and base classes?(派生类和基类之间指针到指针的转换?)
本文介绍了派生类和基类之间指针到指针的转换?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

关于以下 C++ 程序:

Regarding the following C++ program:

class Base { };

class Child : public Base { };

int main()
{   
    // Normal: using child as base is allowed
    Child *c = new Child();
    Base *b = c;

    // Double pointers: apparently can't use Child** as Base**
    Child **cc = &c;
    Base **bb = cc;

    return 0;
}

GCC 在最后的赋值语句上产生以下错误:

GCC produces the following error on the last assignment statement:

error: invalid conversion from ‘Child**’ to ‘Base**’

我的问题分为两部分:

  1. 为什么没有从 Child** 到 Base** 的隐式转换?
  2. 我可以使用 C 样式转换或 reinterpret_cast 使这个示例工作.使用这些强制转换意味着抛弃所有类型安全.有什么我可以添加到类定义中以使这些指针隐式转换的,或者至少以一种允许我使用 static_cast 的方式来表达转换?
  1. Why is there no implicit conversion from Child** to Base**?
  2. I can make this example work with a C-style cast or a reinterpret_cast. Using these casts means throwing away all type safety. Is there anything I can add to the class definitions to make these pointers cast implicitly, or at least phrase the conversion in a way that allows me to use static_cast instead?

推荐答案

如果允许,你可以这样写:

If this was allowed, you could write this:

*bb = new Base;

而且c 最终会指向Base 的一个实例.不好.

And c would end up pointing to an instance of Base. Bad.

这篇关于派生类和基类之间指针到指针的转换?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

What do compilers do with compile-time branching?(编译器如何处理编译时分支?)
Can I use if (pointer) instead of if (pointer != NULL)?(我可以使用 if (pointer) 而不是 if (pointer != NULL) 吗?)
Checking for NULL pointer in C/C++(在 C/C++ 中检查空指针)
Math-like chaining of the comparison operator - as in, quot;if ( (5lt;jlt;=1) )quot;(比较运算符的数学式链接-如“if((5<j<=1)))
Difference between quot;if constexpr()quot; Vs quot;if()quot;(“if constexpr()之间的区别与“if())
C++, variable declaration in #39;if#39; expression(C++,if 表达式中的变量声明)