派生类的构造函数
发布日期:2021-05-04 06:33:45 浏览次数:29 分类:精选文章

本文共 1613 字,大约阅读时间需要 5 分钟。

C++中类的构造函数调用规则是编程中常见的难点之一,特别是在派生类与基类之间如何处理构造函数调用。以下通过几个实际例子详细解析这一问题。

示例1:基类有无参构造函数的情况

#include 
using 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:基类有多个默认构造函数的情况

#include 
using 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:基类有自定义构造函数的情况

#include 
using 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++中,派生类构造函数的初始化列表是否需要显式调用基类构造函数,取决于以下因素:

  • 如果基类有多个默认构造函数,派生类构造函数的初始化列表必须显式指定调用哪个版本的基类构造函数。
  • 如果基类没有默认构造函数,派生类构造函数的初始化列表必须显式调用基类构造函数,否则无法构造对象。
  • 如果基类有无参构造函数,且派生类构造函数的初始化列表没有显式调用基类构造函数,则默认会调用基类的无参构造函数。
  • 上一篇:effective_考虑写出一个不抛出异常的swap函数(涉及到pimpl手法)
    下一篇:effective_别让异常逃离析构函数

    发表评论

    最新留言

    留言是一种美德,欢迎回访!
    [***.207.175.100]2025年04月07日 17时58分56秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章