C++调用父类被重写函数的方法及相关代码疑问解析
关于C++继承中成员函数调用与动态分配的问题
一、调用父类display()的更优方案
你目前用静态绑定的方式确实能调用父类的display(),不过有个更简洁直接的写法——直接用**作用域解析符::**在子类对象上调用父类版本,不需要额外定义Parent指针:
c.Parent::display();
这样写的好处是代码更紧凑,不需要额外创建指针变量,直接明确指定要调用父类的成员函数,可读性也更强,是这种场景下的常规最优写法。
二、关于Parent *p = new Child();的几个问题
1. 这行代码的作用
这行是动态分配一个Child类的对象,然后把这个对象的内存地址赋值给一个Parent类型的指针p。简单说就是在堆上创建了一个子类对象,用父类指针来指向它——这是C++多态机制的常见写法(不过你的代码里display()没加virtual,所以这里不会触发动态多态,p->display()会调用父类的版本)。
2. 是不是指向构造函数的指针?
完全不是哈!构造函数是C++里的特殊成员函数,你没法直接获取它的地址,也不能用指针指向构造函数。这行代码的本质是调用Child的默认构造函数创建对象,然后返回这个对象的首地址,把地址存在Parent*类型的指针p里。
3. 和Parent *p = new Child;的区别
这个区别和C++的版本有关:
- 在C++11之前:
new Child()会对对象做值初始化——如果类里的成员是内置类型(比如int),会被初始化为0;而new Child是默认初始化——内置类型成员会是未定义的垃圾值。 - 在C++11及之后:对于类类型的对象来说,这两种写法效果一致,都会调用类的默认构造函数。不过如果是内置类型(比如
new int()和new int),还是保持之前的区别:前者初始化0,后者未初始化。
对你的代码来说,因为Child的b是在display()里赋值的,所以两种写法运行起来结果一样,但从代码规范角度,new Child()的写法更明确,能避免内置类型成员未初始化的坑。
内容的提问来源于stack exchange,提问作者zZzZ
相关产品推荐
相关产品推荐

