21.(1)继承 与继承中的static数据成员

  • 继承后,构造派生类对象时,会先构造基类
    (多继承中,按继承基类的顺序来构造)

当派生类继承了基类后,构造派生类的对象时会首先构造基类对象,多继承中,按派生类继承基类的顺序来构造,析构过程按构造的反向顺序析构

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

void main()
{
	D d;
}

以上代码的执行结果是:

A::A()
D::D()
D::~D()
A::~A()

  • 当派生类继承的基类的构造方法有默认值的参数时

以下代码时可以正常执行的

//当派生类继承的基类的构造方法有默认值的参数,且派生类成员是基类对象时
class A
{
public:
	A(int a = 0)
	{
		cout << "A::A()" << endl;
	}
	~A()
	{
		cout << "A::~A()" << endl;
	}
private:
	int a_data = 1; //C++11
};
class B
{
public:
	B(int b = 0)
	{
		cout << "B::B()" << endl;
	}
	~B()
	{
		cout << "B::~B()" << endl;
	}
};

class C
{
public:
	C(int c = 0)
	{
		cout << "C::C()" << endl;
	}
	~C()
	{
		cout << "C::~C()" << endl;
	}
};

class D : public C, public A, public B
{
public:
	D()
	{
		cout << "D::D()" << endl;
	}
	~D()
	{
		cout << "D::~D()" << endl;
	}
private:
	A _a;
	B _b;
	C _c;

};

void main()
{
	D d;
}

以上代码的执行结果是:

C::C()
A::A()
B::B()
A::A()
B::B()
C::C()
D::D()
D::~D()
C::~C()
B::~B()
A::~A()
B::~B()
A::~A()
C::~C()

通过以上执行结果可以再次可以证明 :
当派生类继承了基类后,构造派生类的对象时会首先构造基类对象,多继承中,按派生类继承基类的顺序来构造,析构过程按构造的反向顺序析构

  • 当派生类继承的基类的构造方法有参数但无默认值,且派生类成员是基类对象时

必须在派生类的构造函数后面加上基类构造的初始化列表,如果派生类中有成员是基类对象时,在初始化列表中就需要给派生类基类对象成员初始化

//当派生类继承的基类的构造方法有参数但无默认值时
class A
{
public:
	A(int a)
	{
		cout << "A::A()" << endl;
	}
	~A()
	{
		cout << "A::~A()" << endl;
	}
private:
	int a_data = 1; //C++11
};
class B
{
public:
	B(int b)
	{
		cout << "B::B()" << endl;
	}
	~B()
	{
		cout << "B::~B()" << endl;
	}
};

class C
{
public:
	C(int c)
	{
		cout << "C::C()" << endl;
	}
	~C()
	{
		cout << "C::~C()" << endl;
	}
};

class D : public C, public A, public B
{
public:
	D() : B(2), A(1), C(3), _a(0), _b(0), _c(0)
	{
		cout << "D::D()" << endl;
	}
	~D()
	{
		cout << "D::~D()" << endl;
	}
private:
	A _a;
	B _b;
	C _c;

};

void main()
{
	D d;
}

static

基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一
个static成员

class Base
{
public:
	Base()
	{
		object_count++;
	}
protected:
	void fun()
	{
		object_count++;
	}
public:
	static int object_count;
};
int Base::object_count = 0;

class A : public Base
{};

class B : public Base
{};

void main()
{
	A a;
	cout<<a.object_count<<endl;
	B b;
	cout<<a.object_count<<endl;
	cout<<b.object_count<<endl;
}
> 基类静态成员被所有对象(基类和派生类)共有

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值