C++ 类的继承

类的继承可以看做父亲与儿子之间的关系,儿子可以继承父亲的属性,并且自己进行扩展


写法(:继承方式  继承的父类)

class Son:public Father

父类又叫做基类

//父类(基类)
class Father
{
public:
	int fa;
	void funfa()
	{
		cout << "funfa()" << endl;
	}
};

子类又叫做派生类

//子类(派生类)
class Son:public Father
{
public:
	int son;
	void funson()
	{
		fa = 10;
		funfa();
	}
};

可以定义子类对象,通过子类对象,对父类的成员进行调用

Son son;
son.funson();  //funfa()
cout << son.fa << endl;  //10
son.funfa();  // funfa()

作为派生类:包含父类,也包含父类成员,能够直接使用父类的成员。
子类看作是对父类的扩展和延续


当父类和子类包含同名的属性成员时

class Father
{
public:
	int fa;
	void funfa()
	{
		cout << "funfa()" << endl;
	}
	int money;
};

class Son:public Father
{
public:
	int son;
	int money;

子类函数有限调用子类属性,如要使用父类同名属性,需要指明类名作用域

class Son:public Father
{
public:
	int son;
	int money;
	void funson()
	{
		fa = 10;
		funfa();
	}
	void funmoney()
	{
		money = 100;
		Father::money = 200;
	}
};
	son.funmoney();
	cout <<"son.money: " << son.money << "  " <<"son.Father::money:  "<< son.Father::money << endl;

输出结果


定义子类对象计算其大小也包含父类属性

cout << sizeof(Son) << endl;


父类与子类内存排布

父类在前,子类在后

cout << "类地址:" << &son << endl;
cout << "fa:" << &son.fa << endl;
cout << "son.Father::money:" << &son.Father::money << endl;
cout << "son:" << &son.son << endl;
cout << "son.Son::money:" << &son.Son::money << endl;


定义子类对象,子类和父类的构造都会执行,顺序:父类->子类

下面利用一段代码进行测试

class Father
{
public:
	int fa;
	Father() :fa(1) { cout << "Father" << endl; }
};

class Son :public Father
{
public:
	int son;
	Son() { cout << "Son" << endl; }
};
int main()
{
	Son son;
	return 0;
}

测试结果

可以看到先调用了父类的构造函数执行输出语句,后调用子类构造函数输出语句

 析构函数则是相反

先调用子类再调用父类

下面也用代码来测试一下

class Father
{
public:
	int fa;
	Father() :fa(1) { cout << "Father" << endl; }
	~Father(){cout << "~Father()" << endl;}
};

class Son :public Father
{
public:
	int son;
	Son() { cout << "Son" << endl; }
	~Son() { cout << "~Son()" << endl; }
};

测试结果


在子类的初始化参数列表中,会自动调用父类的无参构造函数,在子类的初始化参数列表中,跳转到父类的构造函数
如果想要使用父类的带参构造,必须手动显示的指定调用 

int fun()
{
	cout << "fun" << endl;
	return 2;
}

Son(int a) :Father(a), son(fun()) { cout << "Son" << endl; }

总结

定义子类对象,子类和父类的构造都会执行

构造顺序:父类->子类
析构顺序:子类->父类
因为定义的是子类对象,其生命周期结束,匹配自己类的析构函数,在回收对象本身的空间
在回收对象时,回收顺序与初始化顺序相反,回收子类自己的成员,如果有其他类的成员,则调用其类的析构函数,
最后是继承的父类,调父类的析构.

  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摆烂的李某人O.o

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值