指向类的指针,实现多个接口

时间:2016-04-21 12:20:35

标签: c++11 inheritance

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是否适合演员?

  • ip的二进制表示是否相同?

1 个答案:

答案 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且运行时类型不正确,则表明存在未定义的行为。

派生类指针的二进制值可能与其第一个基类的二进制值相同,但不是第二个基类的二进制值。但是你不应该关心这些实现细节。