new返回的派生类的指针可以类型转换为其基类的指针。
这是真还是假?
我知道dynamic_cast可以用来施放缺点。通常,如何将派生类的指针强制转换为其基类的指针?
答案 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_cast
和static_cast
都可以执行向下转发。
......与此同时,你在讨论如何投射new
的结果,当然,这只能被提升,但不会被低估。
那么,你问的是什么?向上倾倒或向下倾斜?