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

