c++派生类构造函数问题

c++中一个派生类类创建了派生类的构造函数后还可以创建其他的构造函数(以自己的数据成员为参数的带参构造函数或无参构造函数)吗

构造函数是为了初始化用的,你已经执行了一个构造函数,为什么还要再执行另一个构造函数
如果你需要给变量赋值,那你赋值就好了呀

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/652266
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:C++继承与派生:派生类中对基类成员的重定义
  • 除此之外, 这篇博客: C++中子类基类的构造函数和析构函数的调用中的 派生类的构造函数与析构函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 基类的构造函数只对基类的数据成员进行初始化,派生类的构造函数只对派生类新增的数据成员进行初始化,同时也会调用基类的构造函数。
    用派生类建立一个对象时,执行构造函数的顺序是:先调用基类的构造函数,再执行派生类构造函数本身。
    释放对象时,执行析构函数的顺序是:先调用子类的析构函数,再调用基类的析构函数
    定义基类:

    class A
    {
    public:
    	A()
    	{
    		cout << "AA" << endl;
    	}
    	~A()
    	{
    		cout << "~AA" << endl;
    	}
    };
    

    定义子类:

    class B :public A
    {
    public:
    	B()
    	{
    		cout << "BB" << endl;
    	}
    	~B()
    	{
    		cout << "~BB" << endl;
    	}
    };
    

    建立基类对象,调用基类的构造函数:

    A* pA = new A();//输出AA
    

    释放基类对象,调用基类的析构函数:

    delete pA; //输出~AA
    

    建立子类对象,先调用基类的构造函数,再执行子类的构造函数

    B* pB = new B();//先调用基类的构造函数,输出AA,再调用子类的构造函数,输出BB
    

    释放子类对象,先调用子类的析构函数,再调用基类的析构函数

    delete pB;  //先调用子类的析构函数,输出~BB,再调用基类的析构函数,输出~AA
    

    main函数:

    int main()
    {
    	A* pA = new A();//输出AA
    	delete pA; //输出~AA
    	B* pB = new B();//
    	delete pB; 
    	return 0;
    }
    

    执行结果:
    在这里插入图片描述
    基类指针指向子类对象,先调用基类的构造函数,再执行子类构造函数

    pA = new B();//先调用基类的构造函数输出AA,再调用子类的构造函数,输出BB
    

    释放指针,这里只调用了基类的析构函数,子类的析构函数并没有调用。按理说是要调用子类的析构函数的,那么这就有问题了。该怎么解决呢?就是在基类中定义虚析构函数

     delete pA;  //输出~AA
    

    在基类中定义虚析构函数

    class A
    {
    public:
    	A()
    	{
    		cout << "AA" << endl;
    	}
    	virtual ~A()
    	{
    		cout << "~AA" << endl;
    	}
    };
    

    子类

    class B :public A
    {
    public:
    	B()
    	{
    		cout << "BB" << endl;
    	}
    	~B()
    	{
    		cout << "~BB" << endl;
    	}
    };
    

    将基类指针指向子类对象,释放基类指针时,就会先调用子类的析构函数,再调用基类的析构函数。

    int main()
    {
    	A* pA = new A();//输出AA
    	  pA = new B();//基类指针指向子类对象,先调用基类的构造函数输出AA,再调用子类的构造函数,输出BB
    	 delete pA;  
    	 return 0;
    }
    

    此时的执行结果为:
    在这里插入图片描述

  • 您还可以看一下 王健伟老师的C++语言基础到进阶课程中的 类型转换构造函数、运算符,类成员指针小节, 巩固相关知识点