繁体   English   中英

派生类的指针是否可以类型转换为其基类的指针?

[英]Can a pointer of a derived class be type cast to the pointer of its base class?

new返回的派生类的指针可以类型转换为其基类的指针。

这是对还是错?

我知道dynamic_cast可以用来强制下行。 通常,如何将派生类的指针强制转换为其基类的指针?

是。 从指向派生类的指针转换为指向基类的指针是隐式的。 因此,以下是完全正常的:

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

D* my_d_ptr = new D;
B* my_d_ptr_as_a_b_ptr = my_d_ptr;

将指向派生的指针转换为指向base的指针应该是隐式的。 这是多态的全部要点:派生类的实例应该始终可以安全地用作基类的实例。 因此,不需要明确的演员表。

如果派生类从基础继承“公开”和“非虚拟”,那就是这样:

你不能隐式地将Derived*转换为Base*也不能使用static_cast / dynamic_cast(C-cast会完成这项工作,但在使用这个hack之前你应该三思而后行!);

class Base { };

class Derived : protected Base { };

int main()
{
   Base* b = new Derived(); // compile error
}

如果基类不明确,也不起作用:

class Base { };

class Derived1 : public Base { };
class Derived2 : public Base { };

class MostDerived : public Derived1, Derived2 { };

int main()
{
   Base* b = new MostDerived(); // won't work (but you could hint compiler
                                // which path to use for finding Base
}

编辑:添加了代码示例,添加了不明确的用例,删除了虚拟继承示例。

你的问题不明确,因为它混合了几个不同的东西。

一方面,指向派生类的指针可以转换为指向基类的指针(假设基类是可访问的)。 这是一种自然转换,不需要任何演员来做。

另一方面,您提到了dynamic_cast及其执行向下转换的能力。 但是,向下转换是相反的方向:从指向基类的指针到指向派生类的指针。 可以通过dynamic_caststatic_cast执行static_cast具体取决于您需要什么以及您需要多少运行时检查。

......与此同时,你在谈论铸造new的结果,当然,这只能被提升,但不会被低估。

那么,你问的是什么? 向上倾倒还是向下倾斜?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM