2

在下面的代码中,我可以将 的返回值分配给D::clone()指向 的指针B,但不能分配指向 的指针D。是否可以从基指针的调用中返回实际的多态类型?

struct B
{
    virtual B * clone() { return this; }
};

struct D : B
{
    D * clone()
    {
        std::cout << std::is_same<decltype(this), D *>::value << std::endl;
        return this;
    }
};

int main()
{
    B * b = new D();
    B * bb = b->clone(); // prints "1"
    std::cout << std::is_same<decltype(b->clone()), D *>::value << std::endl; // prints "0"
    D * d = b->clone(); // error: invalid conversion from B * to D * (GCC 5.1)
}
4

1 回答 1

4

clone()不会。在 a的基B类上调用D会将强制转换返回D*到 a B*

static_cast<D*>如果您绝对确定,或者如果您不确定,您可以通过执行 a 来扭转这种dynamic_cast<D*>情况。如果您确定,那么您应该真正将变量b设为 a D*

在 C++ 中,无论运行时情况如何,您都应该在编译时将您对程序状态的了解编码为类型。通过存储D*into B* b,您是在告诉编译器不要“知道”指向的数据“是一个D”。相反,您是在说“使用的代码B*b应该对任何指向 - 的指针都有效B。显然D* d = b->clone();不能保证对每个指向 - 的指针都有效B

于 2015-07-14T18:44:14.700 回答