
派生类的构造函数
如果基类有多个默认构造函数,派生类构造函数的初始化列表必须显式指定调用哪个版本的基类构造函数。 如果基类没有默认构造函数,派生类构造函数的初始化列表必须显式调用基类构造函数,否则无法构造对象。 如果基类有无参构造函数,且派生类构造函数的初始化列表没有显式调用基类构造函数,则默认会调用基类的无参构造函数。
发布日期:2021-05-04 06:33:45
浏览次数:29
分类:精选文章
本文共 1613 字,大约阅读时间需要 5 分钟。
C++中类的构造函数调用规则是编程中常见的难点之一,特别是在派生类与基类之间如何处理构造函数调用。以下通过几个实际例子详细解析这一问题。
示例1:基类有无参构造函数的情况
#includeusing namespace std;class B {public: B() { cout << "无参构造函数" << endl; } B(int bb):b(bb) { cout << "有参构造函数" << endl; }private: int b;};class D :public B {public: D(int bb, int dd):d(dd) { }private: int d;};int main() { D d(1, 2); system("pause"); return 0;}
在这个例子中,当派生类D的构造函数调用基类B的构造函数时,会调用哪个版本的构造函数?答案是B()!因为派生类构造函数的初始化列表中没有显式地调用基类构造函数,而基类B有一个无参构造函数,且基类B的另一个有参构造函数是通过另一个方式调用。
示例2:基类有多个默认构造函数的情况
#includeusing namespace std;class B {public: B() { cout << "无参构造函数" << endl; } B(int bb=0):b(bb) { cout << "有参构造函数" << endl; }private: int b;};class D :public B {public: D(int bb, int dd):d(dd) { }private: int d;};int main() { D d(1, 2); system("pause"); return 0;}
在这个例子中,基类B有两个构造函数:一个无参构造函数和一个有参构造函数,默认参数为0。当派生类D的构造函数调用基类B的构造函数时,由于基类B有多个默认构造函数,编译器不知道该选择哪个版本进行调用。这会导致编译错误,提示编译器无法决定调用哪个构造函数。
示例3:基类有自定义构造函数的情况
#includeusing namespace std;class B {public: B(int bb):b(bb) { cout << "有参构造函数" << endl; }private: int b;};class D :public B {public: D(int bb, int dd):d(dd) { }private: int d;};int main() { D d(1, 2); system("pause"); return 0;}
在这个例子中,基类B只有一个有参构造函数,没有无参构造函数。当派生类D的构造函数调用基类B的构造函数时,由于基类B没有默认构造函数,派生类构造函数的初始化列表中必须显式地调用基类B的构造函数。否则,编译器会报错提示基类没有默认构造函数,无法自动调用。
总结
在C++中,派生类构造函数的初始化列表是否需要显式调用基类构造函数,取决于以下因素:
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月07日 17时58分56秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
课程总结
2019-03-11
认识CMake及应用
2019-03-11
CMake的主体框架
2019-03-11
微积分(三)
2019-03-11
Oracle
2019-03-11
软件工程应用
2019-03-11
数据科学
2019-03-11
函数与高级变量
2019-03-11
键盘事件
2019-03-11
注册页面案例
2019-03-11
np.bincount(x)的简单解释
2019-03-11
LeetCode Top-100 T22-括号生成
2019-03-11
vscode设置eslint保存文件时自动修复eslint错误
2019-03-11
JAVA 多线程
2019-03-11
Java的 arraylist类【具体案例】
2019-03-11
牛客-链表中环的入口节点(Java)
2019-03-11
解决微信小程序中 calc 失效问题
2019-03-11
JS数组去重的方法
2019-03-11
堆的应用_topK算法和堆排序
2019-03-11
最大半连通子图
2019-03-11