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

时间:2010-01-28 16:26:53

标签: c++

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

这是真还是假?

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

4 个答案:

答案 0 :(得分:14)

是。从指向派生类的指针转换为指向基类的指针是隐式的。因此,以下内容非常好:

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:3)

如果派生类从base继承'公开'和'非虚拟',那就是这样:

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

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
}

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

答案 3 :(得分:1)

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

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

另一方面,您提及dynamic_cast及其执行向下广播的能力。但是,向下转换是相反的方向:从指向基类的指针到指向派生类的指针。根据您的需要以及您需要的运行时检查量,dynamic_caststatic_cast都可以执行向下转发。

......与此同时,你在讨论如何投射new的结果,当然,这只能被提升,但不会被低估。

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