假设我在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&)

10-04 23:33
查看更多