You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:22:14