C 中的向下转型:揭示未定义的行为
在面向对象编程中,向下转型是转换指针或引用的过程基类到派生类的指针或引用。在 C 中,这可以使用 static_cast 运算符来实现。然而,不正确的向下转换的后果可能会令人困惑。
考虑以下代码片段:
class base { public: base(); virtual void func(); }; class derived : public base { public: derived(); void func(); void func_d(); int a; }; int main() { base *b = new base(); std::cout << sizeof(*b) << std::endl; // Prints 4 derived *d = static_cast<derived*>(b); std::cout << sizeof(*d) << std::endl; // Prints 8 d->func_d(); // Calls derived class function successfully }
在此示例中,使用 static_cast 将基指针 b 转换为派生指针 d。令人惊讶的是,d 可以访问整个派生对象,包括成员函数 func_d()。这就提出了一个问题:当 b 只指向一个基础对象时,这怎么可能?
答案在于不正确的向下转换引入的 未定义行为。根据 C 标准,使用 static_cast 将指针转换为实际上并不具有未定义行为的结果。这意味着任何事情都可能发生,包括派生类函数的正确执行。
向下转型的正确方法涉及使用安全的强制转换运算符,例如dynamic_cast。该运算符检查基指针是否指向实际的派生对象,如果没有则抛出异常,以确保适当的类型安全。
以上是C 中的向下转型何时是安全的,何时会导致未定义的行为?的详细内容。更多信息请关注PHP中文网其他相关文章!