C++中派生类的构造函数怎么显式调用基类构造函数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中派生类的构造函数怎么显式调用基类构造函数?相关的知识,希望对你有一定的参考价值。

子类构造的时候会自动调用基类的构造函数 并且是有顺序的
调用完构造函数的顺序 :基类 子类 子子类 ...

不仅构造函数 析构函数也这样 子类对象析构时自动调用基类的析构函数
顺序与构造函数顺序相反 :子类...基类

关于显示调用基类的构造函数,是不可行的。必须用初始化表的形式调用基类构造函数,才能正确的把子类继承下来的父类的成员初始化了。如果在子类构造函数体内显式调用了基类构造函数的话,那么该构造函数就会对一个在子类构造函数内存空间内的一个临时对象进行了初始化,因为没有取得正确的对象(子类对象)的指针。所以构造了半天白费。等子类构造函数退出,则统统丢失。所以,基类构造函数在没拿到正确this指针的情况下,没有办法正确赋值。下面是例子:

#include <iostream>
#include<string>
using namespace std;
class CLSA
public:
CLSA( )


CLSA( int i ) : m_j(i)
int getA()
return m_j;
private:
int m_j;
;

class CLS: public CLSA

public:
CLS( int i,int j );

/*CLS()

CLS(0);
*/
int m_i;
;
CLS::CLS( int i,int j ) : m_i(i) ,CLSA(j)

CLSA(10);//这里显式调用基类构造函数给临时对象进行赋值的,但是等CLS构造函数退出返回后,临时对象丢失。所以, 这个函数没有给真正的对象赋值。因为没有取得正确的this地址。

int main()

CLS obj(2,3);
cout << obj.m_i << endl; //输出结果是什么?CLSA(j),
cout<<obj.getA();
return 0;
参考技术A #include<iostream>
using namespace std;
class Base

public:
Base(int a):
a(a)



protected:
int a;
;
class A:public Base

public:
A(int a,int b):
Base(a),b(b)



void disp()

cout<<a<<" "<<b<<endl;

private:
int b;

;

void main()

A a(3,5);
a.disp();
return;

派生类的构造函数与析构函数的调用顺序

派生类构造函数各部分的执行次序为
1.调用基类的构造函数,按他们在派生类定义的先后顺序,顺序调用。
2.调用成员对象的构造函数,按他们在类定义中声明的先后顺序,顺序调用
3.派生类的构造函数体中的操作
在派生类构造函数中,只要基类不是使用缺省构造函数,都要显式给出基类名和参数表
如果基类没有定义构造函数,则派生类也可以不定义,全部采用系统给定的缺省构造函数。
如果基类定义了带有形参表的构造函数时,派生类就应当定义构造函数。
//Test1.h
#include<iostream>
using namespace std;
class Base1
{
private:
    int a1;
public:
    Base1()//(int _a):a1(_a)
    {
        cout<<"It‘s base1 built. "<<endl;
    }
    ~Base1(){cout<<"Base1 was free. "<<endl;}
};
class Base2
{
private:
    int a2;
public:
    Base2()//(int _a):a2(_a)
    {
        cout<<"It‘s base2 built. "<<endl;
    }
    ~Base2(){cout<<"Base2 was free. "<<endl;}
};
class Base3
{
private:
    int a3;
public:
    Base3()//(int _a):a3(_a)
    {
        cout<<"It‘s base3 built. "<<endl;
    }
    ~Base3(){cout<<"Base3 was free. "<<endl;}
};
class Son : public Base2,public Base1,public Base3//1.调用基类的构造函数,按他们在派生类定义的先后顺序,顺序调用。
{     
private://2.调用成员对象的构造函数,按他们在类定义中声明的先后顺序,顺序调用
    Base1 a;
    Base3 b;
    Base2 c;
public:
    Son()//:Base1(_a),Base2(_a),Base3(_a),a(_a),b(_a),c(_a)
    {
        cout<<"It‘s son built. "<<endl;//3.派生类的构造函数体中的操作
    }
    ~Son(){cout<<"Son was free. "<<endl;}
};
将父类和派生类构造函数后的“//”去掉便是
在派生类构造函数中,只要基类不是使用缺省构造函数,都要显式给出基类名和参数表
所描述的意思。

 

//Test.cpp
#include"Test1.h" void main() { Son son;//son(10) }

由Son类可以看出构造函数的顺序应该为2,1,3,1,3,2,son

运行结果

技术图片

析构函数和构造函数顺序相反。









以上是关于C++中派生类的构造函数怎么显式调用基类构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

C++基类和派生类的构造函数

C++中派生类重写基类重载函数时需要注意的问题:派生类函数屏蔽基类中同名函数

C ++继承:具有基类类型的虚函数中派生类类型的参数

C++中如何在子类的构造函数中调用基类的构造函数来初始化基类成员变量

C++学习之路派生类的构造函数

C ++中派生类的相等性测试[重复]