假设我在C ++中具有以下模式:
class A {};
class B : public A {};
class C : public A {};
这些显然应该起作用(向父类型进行类型转换):
A a;
B b;
a = static_cast<A>(b);
a = static_cast<A>(c);
这些应该在编译时起作用,但是可能会导致运行时问题:
b = static_cast<B>(a);
c = static_cast<C>(a);
我是否可以假定它永远不会通过编译检查(假设不存在从一个类转换为另一个类的构造函数)?
b = static_cast<B>(c);
c = static_cast<C>(b);
最佳答案
要利用适当的多态性,您应该使用指针。
在这里,您只是在调用A::operator=(const A&)
。从此开始,您将拥有3个默认赋值运算符:
A::operator=(const A&)
B::operator=(const B&)
C::operator=(const C&)
B是-A,而C是-a A,因此您在前两个作业中不需要
static_cast
。但是,使用强制类型转换将更改分配方式。使用强制转换时,将通过调用A::A(const A&)
将对象切为一个A实例,然后通过A::operator=(const A&)
进行分配,但是如果没有强制转换,则仅将后者调用。在任何情况下,其他类型的转换都会失败,这是因为
static_cast
会在两种类型之间进行转换,但是,例如,static_cast<B>(a)
需要未定义的B::B(const A&)
。