10. 继承

基类:base

派生类:derived

protected修饰的成员可以被类自身和派生类访问,类外不能访问

 

基类

子类是否可访问

类外是否可访问

public

YES

YES

private

NO

NO

protected

YES

NO

 

 

 

构造时,基类先构造,派生类后构造。

析构时,派生类先析构,基类后析构。

 

数据隐藏:当子类含有和父类同名的成员时,访问子类自身的。

 

子类的指针或引用可以隐式转换为父类的指针或引用,反之则不可以。

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

	~B() {
		cout << "~B()" << endl;
	}
protected:
	int age = 1;
	int wage = 2;
};

class D :public B {
public:
	D() {
		cout << "D()" << endl;
		age = 1;
		wage = 100;//父类子类都有wage,由于数据隐藏,此处访问子类自身的
		B::wage = 1000;//明确指出访问父类的
	}

	~D() {
		cout << "~D()" << endl;
	}
private:
	int wage = 3;
};
int  main() {
	B b;
	D d;

	//b.age = 1;// 类外不能访问
	//d.age = 2;// 类外不能访问

B *p1 = &d;//发生指针的隐式转换,因为子类中有父类需要的数据
	//D *p2 = &b;//编译错误,无法确保父类中有子类需要的数据
	return 0;
}

  

派生类d构造完成时的内存分布:前8字节是基类B的成员,接下来是d新增的成员。

 

 

继承:is A

组合:has A

posted @ 2020-05-16 22:26  八转达人  阅读(123)  评论(0)    收藏  举报