![](/img/trans.png)
[英]Cast pointer of base class to derived template class without knowing the type
[英]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_cast
和static_cast
执行static_cast
具体取决于您需要什么以及您需要多少运行时检查。
......与此同时,你在谈论铸造new
的结果,当然,这只能被提升,但不会被低估。
那么,你问的是什么? 向上倾倒还是向下倾斜?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.