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

关于C++静态绑定下Base* wsk = new Derived的疑问确认

关于C++静态绑定场景下Base* wsk = new Derived的疑问解答

嘿,我来帮你把这些疑问掰扯清楚:

  • 是否会创建Derived类型的对象?
    绝对会!new Derived这个表达式的作用就是在堆上创建一个Derived类的实例,和你用什么类型的指针去接收它完全没关系。编译器执行到这行代码时,会为Derived对象分配内存,调用Derived的构造函数。

  • wsk类型是Base,但是否仍指向该Derived类型对象?
    没错!这里wsk的静态类型是Base*(编译器在编译时看到的类型),但它指向的对象的动态类型是Derived(程序运行时实际存在的对象类型)。这个指针确实牢牢指向你刚创建的Derived实例,就像你用一个装水果的盒子装了一个苹果,盒子是“水果盒”,但里面的东西还是苹果。

  • 是否因wsk为Base类型而无法调用Derived类的方法?
    分两种情况看:

    1. 如果Derived有Base中没有的独有的成员方法,那直接用wsk->derived_only_method()会编译失败——静态绑定场景下,编译器只认指针的静态类型Base*,它不知道wsk实际指向的是Derived对象,所以不会允许调用Base中不存在的方法。如果一定要调用,你需要先把wsk强制转换为Derived*(比如用dynamic_cast<Derived*>(wsk),前提是类体系有虚函数支持RTTI)。
    2. 如果是Derived重写了Base中的非虚方法,静态绑定下调用wsk->some_method()会执行Base版本的方法,因为编译器还是根据静态类型来解析调用,不会管实际对象的类型。
  • 核心疑问确认:
    完全正确!wsk虽然静态类型是Base*,但它确实指向的是新建的Derived类型对象。这种“静态类型和动态类型不一致”的情况,正是C++实现多态的基础(当然多态需要配合虚函数的动态绑定,但即使是静态绑定场景,指针指向的对象类型依然是实际new出来的类型)。

内容的提问来源于stack exchange,提问作者Tojmak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:07:51