class I1 {};
class I2 {};
class C : public I1, public I2 {};
C c;
I1 *i = static_cast<I1*>(&c);
C *p = static_cast<C*>(i);
我试图了解对象指针和接口指针之间的转换是否安全。
以上代码是错误的吗?对象切片是否有问题?为什么?
static_cast
是否适合演员?
i
和p
的二进制表示是否相同?
答案 0 :(得分:1)
您的代码没问题。没有切片,因为你正在构建指针,而不是类类型。请注意,此处甚至不需要演员表:
I1 *i = static_cast<I1*>(&c);
static_cast
是适合其他方向的演员:
C *p = static_cast<C*>(i);
如果您的接口类具有虚拟方法(它们通常在实际程序中),如果您不确定dynamic_cast
的类型直到运行时,您还可以使用i
:
if (C *p = dynamic_cast<C*>(i)) {
// use p
}
dynamic_cast
的要点是它使用RTTI来确定演员表是否有效。如果没有,它将返回null。如果使用static_cast
且运行时类型不正确,则表明存在未定义的行为。
派生类指针的二进制值可能与其第一个基类的二进制值相同,但不是第二个基类的二进制值。但是你不应该关心这些实现细节。