考虑:

class base
{
    base();
    virtual void func();
}

class derived : public base
{
    derived();
    void func();
    void func_d();
    int a;
}


main
{
    base *b = new base();
    sizeof(*b); // Gives 4.
    derived * d = static_cast<derived*>(b);
    sizeof(*d); // Gives 8- means whole derived obj size..why?
    d->func_d();
}

在上面的代码中,我对基本指针进行了向下转换,该基本指针指向基础对象和派生的类指针。我想知道派生指针如何具有整个派生类对象。我可以调用派生类函数(仅在派生类中声明)。我在这里没有得到这个概念。

最佳答案

使用static_cast将对象转换为实际上没有的类型会产生未定义的行为。 UB的症状差异很大。没有什么说UB不能成功地调用派生成员函数(但是没有任何东西可以保证它会被成功调用,所以不要指望它)。

这是使用static_cast向下转换的规则,该规则在C++标准(C++ 0x措辞)的5.2.9节([expr.static.cast])中找到:

关于c++ - 在C++中使用 'static_cast'向下转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6322949/

10-16 04:59