基类与派生类关系的详细探讨

一:派生类对象模型概述

派生类对象模型概述:
一个派生类对象模型当中包含了多个子对象,
多个子对象是什么意思?
例如一个派生类man继承于human类,,那么派生类man就包括两个部分,一个是自己所定义的成员变量,成员函数部分,这一部分是一个子对象,另一部分就是从基类继承过来的那部分,也就是基类当中的成员函数和成员变量。

例如:
#include "pch.h"
#include <iostream>
using namespace std;

class human
{
public:
	human(int i):m_i(i)
	{
		cout << "human()" << endl;
	}

	virtual	~human()
	{
		cout << "~human()" << endl;
	}
public:
	int m_i;
};

class man :public human
{
public:
	man(int x,int y):human(x),m_j(y)
	{
		cout << "man()" << endl;
	}

	~man()
	{
		cout << "~man()" << endl;
	}
public:
	int m_j;
};

int main()
{
	man obj(1,2);
	cout << obj.m_i << endl;
	return 0;
}

二:派生类构造函数

当我们定义一个派生类对象时,即会调用父类的构造函数也会调用子类的构造函数,这个该怎么理解呢?

按照一的说法:派生类包含有多个部分,而所包含基类部分当中,,他们的初始化工作当然是由基类的构造函数来完成的,
而派生类中自己的成员变量等等由派生类自己的构造函数来完成初始化。

所以,如果一个基类当中如果有一个带有参数的构造函数,那么当一个类去继承它的时候,这个派生类的构造函数当中就必须要包含有对基类构造函数的初始化,,因为基类和派生类的构造函数都会调用,当我们定义一个派生类对象的时候。

所以,当我们定义一个派生类对象的时候,要如何去调用基类的构造函数呢?我们只需要在派生类构造函数初始化列表里包含基类的初始化就可以了,例如:

#include "pch.h"
#include <iostream>
using namespace std;

class human
{
public:
	human(int i):m_i(i)
	{
		cout << "human()" << endl;
	}

	virtual	~human()
	{
		cout << "~human()" << endl;
	}
public:
	int m_i;
};

class man :public human
{
public:
	man(int x,int y):human(x),m_j(y)  //对基类的初始化
	{
		m_i = 10;
		cout << "man()" << endl;
	}

	~man()
	{
		cout << "~man()" << endl;
	}
public:
	int m_j;
};

int main()
{
	man obj(1,2);
	cout << obj.m_i << endl;
	return 0;
}

三:既当父类又当子类

也就是这个类即继承了别的类,然后自己也被其它类继承了。
例如:
class A {};
class B :public A
class C:class B{ };
这里类B既是父类也是子类。

四:不想当基类的类

#include "pch.h"
#include <iostream>
using namespace std;

class human final //在类名后面加上final表明这个类不希望被继承
{
public:
	human()
	{
		cout << "human()" << endl;
	}
public:
	int m_i;
};

class man :public human //错误,human不希望作为基类
{
public:
};

int main()
{
	return 0;
}

或者:
#include "pch.h"
#include <iostream>
using namespace std;

class human 
{
public:
	human()
	{
		cout << "human()" << endl;
	}
public:
	int m_i;
};

class man final  :public human 
{
public:
};

class A :public man//错误
{

};

int main()
{
	return 0;
}

五:静态类型与动态类型

只有基类指针才有动态类型与静态类型不一致的情况。

静态类型:定义时(编译时)就知道的类型
动态类型:运行时才知道的类型


六:派生类向基类的隐式类型转换


七:父类与子类之间的拷贝与赋值


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值