c++ - 在继承类型的指针之间进行静态转换

标签 c++ inheritance casting static-cast

我正在尝试这样做

static_cast<IntrusivePtr<B>>(IntrusivePtr<A>)

其中 B 公开派生自 A。但是这给出了错误

invalid conversion from A* to B*

谁能给我解释一下这里的问题?我可以通过做来解决这个问题

static_cast<B*>(IntrusivePtr<A>.get())

理论上这正是上面错误信息所说的是不允许的。这是在 GCC 4.4.7 上

最佳答案

您正在寻找的概念称为类型协方差 - 您需要 IntrusivePtr<T>T 上协变,这意味着 IntrusivePtr<D>IntrusivePtr<B> 的子类型如果DB 的子类型.有些语言的类型系统支持这一点,C++ 不是其中之一。

在 C++ 中,IntrusivePtr<A>IntrusivePtr<B>是完全不相关的类型,不管是什么AB是(除非它们是同一类型)。如果您想支持该转换,则必须明确支持它:

template <class T>
struct IntrusivePtr {
    template <class U, class = std::enable_if_t<std::is_convertible<U*, T*>::value>>
    IntrusivePtr(IntrusivePtr<U> const& rhs) { ... }
};

或者做你正在做的事情并回避IntrusivePtr类模板。


重新阅读问题后回想起来,IntrusivePtr 似乎更有可能。支持上述转换,但在两种类型之间进行隐式转换——这对派生到基有效但对基到派生无效。但是您始终可以显式地从基数转换为派生数。即:

struct B { };
struct D : B { };

B b;
D* d1 = &b;                  // error
D* d2 = static_cast<D*>(&b); // ok

关于c++ - 在继承类型的指针之间进行静态转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37053826/

相关文章:

java - 有没有办法在不修改方法的情况下从java中的子类对象调用父类方法

c++ - 继承,调用基类构造器

Java - 避免使用父类(super class)对象数组进行强制转换

c++ - 在 C++ 中将 double 转换为 int 而不会出现向下舍入错误

c++ - 基于像素和基于帧的方法之间的区别

c++ - 如何将 IAudioClient3 (WASAPI) 与实时工作队列 API 一起使用

c++ - 基类的友元类如何通过基类派生类的对象访问该基类的成员呢?

c++ - 此代码如何从两个二维 vector 的叉积中检索二维 vector ?

c++ - 如何 memset 一个 bool 数组?

java - 将错误类型的对象放入 Map 中