C++继承中子类调用父类带参构造函数却触发默认构造的问题咨询
嘿,作为有8年JS开发经验的大佬,肯定对JS里的继承和构造逻辑门儿清,但C++的类继承构造规则确实和JS不一样,咱们来拆解你遇到的这个问题:
为什么父类无参构造会被调用?
在C中,当子类的构造函数没有显式指定要调用父类的哪个构造函数时,编译器会自动帮你插入一行对父类无参默认构造函数的调用——这是C初始化父类成员的默认行为。你当前的Dragon(string name, float health)构造函数里没有指定父类构造,所以程序会先执行Creature(),这就是你看到第一行输出的原因。
为什么你写的Creature(name, health)没生效?
你在Dragon构造函数体内写的Creature(name, health),并不是在初始化当前Dragon对象的父类成员部分,而是临时创建了一个全新的Creature对象!这个临时对象创建完成后就会立刻销毁,和你正在构造的dragon2半毛钱关系都没有,所以dragon2.Name还是父类无参构造里设置的UNAMED。
怎么修复这个问题?
你需要用C++的构造函数初始化列表,在子类构造函数的开头显式指定要调用父类的带参构造,而不是在构造函数体内临时创建对象。修改后的Dragon带参构造应该是这样:
Dragon::Dragon(string name, float health) : Creature(name, health) { cout << "Dragon constructor WITH arguments" << endl; }
修改后的预期输出
当你用这个修复后的代码运行时,输出就会和你预期的一致:
Creature constructor WITH arguments
Dragon constructor WITH arguments
The Dragon's name should be Smaug: Smaug
最后补一句:JS是基于原型链的继承模型,C++是类的静态继承,两者构造逻辑差异不小,踩这个坑很正常,适应一下就好啦~
内容的提问来源于stack exchange,提问作者JDillon522

