C风格类型转换中“带扩展”的含义及有无扩展的转换示例
关于C风格转换中static_cast“带扩展”的含义及示例
核心含义
这里的“带扩展”指:C风格转换在尝试解析为static_cast时,突破了普通static_cast的访问权限限制——普通static_cast无法完成私有/保护继承的派生类与基类之间的指针/引用转换(因为基类对派生类外部不可访问),但这个扩展版本的static_cast会忽略继承的访问修饰符(比如private/protected继承),允许进行无歧义的上下转换(派生→基类、基类→派生),同时也支持将成员指针转换为无歧义非虚基类的成员指针,哪怕基类是私有继承的。
示例对比
1. 不带扩展的普通static_cast(编译失败)
当类之间是私有继承时,普通static_cast因访问权限限制无法完成转换:
class Base { }; class Derived : private Base { }; int main() { Derived d; // 编译报错:Base是Derived的私有基类,不可访问 Base* b = static_cast<Base*>(&d); return 0; }
2. 带扩展的C风格转换(编译成功)
同样的私有继承场景,C风格转换会调用扩展版static_cast,跳过访问权限检查完成转换:
class Base { }; class Derived : private Base { }; int main() { Derived d; // C风格转换触发带扩展的static_cast,转换成功 Base* b = (Base*)&d; return 0; }
成员指针的扩展转换示例
该规则同样适用于成员指针的转换:
class Base { public: int x; }; class Derived : private Base { }; int main() { // 普通static_cast编译失败:Base是私有基类 // int Base::*mp = static_cast<int Base::*>(&Derived::x); // C风格转换触发扩展版static_cast,成员指针转换成功 int Base::*mp = (int Base::*)&Derived::x; return 0; }
内容的提问来源于stack exchange,提问作者LiDa Cute
相关产品推荐
相关产品推荐

