C++继承-创新互联

继承本质是类层次的复用。

创新互联服务项目包括留坝网站建设、留坝网站制作、留坝网页制作以及留坝网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,留坝网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到留坝省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

学生和老师的类中包含Person类的内容。 

Print函数也是继承下来的。 

上述代码中,Peraon叫父类,也叫基类,Student叫子类也叫派生类。

public叫继承方式,继承方式包括公有保护和继承。

基类中的私有本质是不想被继承。

父类中的私有成员,子类中不能访问。父类中的保护成员,子类可以访问。

但是age在studen类中,就是不能被访问。

基类的私有成员在子类都是不可见。基类的其他成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式),public >protected >private。

去掉继承方式,class默认是私有继承,子类外部不能访问继承成员,struct默认是公有继承,子类外部能访问继承成员。

子类会先构造父类,然后构造子类,析构时先析构子类,再析构父类。


父类和子类赋值转换。

子类对象 可以赋值给 父类的对象 / 父类的指针 / 父类的引用。 

int main()
{
Person p;
Student s;
p=s;
}

其中p=s中间不存在类型转换,没有产生临时变量。

而底下这个i=d会产生临时变量,临时变量是int类型。

所以底下没有const修饰的引用会报错。在前面加上const就好了。

父类 ++后,子类也++

赋指针也行,指针指向子类中的父类部分。

  • 继承中的作用域

下面这个_num访问的是Student本身的_num

访问父类的话可以指定作用域。

子类和父类有同名成员时,子类隐藏了父类成员。

子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,
也叫重定义。 


两个fun构成隐藏关系。 

构成隐藏关系。

父类和子类函数名相同就构成隐藏。

重载要求必须在同一个作用域。 两个fun不构成重载。

class A
{
public:
	void fun()
	{
		cout<< "A::func()"<< endl;
	}
};
class B : public A
{
public:
	void fun(int i)
	{
		cout<< "B::func(int i)->"<< i<< endl;
	}
};

void Test()
{
	B b;
	b.fun(10);
};

如果去掉fun调用时的参数,就会编译报错。

因为两个fun构成隐藏关系,去掉fun的参数,就要访问A中的fun,但因为被隐藏,直接访问不行。

class A
{
public:
	void fun()
	{
		cout<< "A::func()"<< endl;
	}
};
class B : public A
{
public:
	void fun(int i)
	{
		cout<< "B::func(int i)->"<< i<< endl;
	}
};

void Test()
{
	B b;
	b.fun();
};

这样改就行了。 

建议继承中不要定义同名成员。


  • 派生类的默认成员函数

为什么调用Student会调用Person中的函数并执行?

子类中,父类成员调用父类构造函数完成初始化。

父类没有默认构造函数会报错。

规定不能在子类初始化列表直接初始化父类成员变量。

必须要调用父类的成员函数。

下面看看拷贝构造。

父类部分调用父类拷贝构造。

而如果是自定义类型,需要我们写个拷贝构造。

我们看到父类中拷贝构造函数参数是父类。

在这里如何找到要拷贝的Person对象?

我们直接传s就可以, 

子类传给父类发生了赋值转换。s传的就是Person中的内容。 

我们来看看赋值。

我们不写,也会默认调用父类赋值。

显示写就这样写。 

但这样运行会报栈溢出错误。

因为这个赋值和父类赋值构成隐藏关系,这里面的operator=(s)调用的是自己,所以会栈溢出。

这样改就好了。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


名称栏目:C++继承-创新互联
文章位置:http://azwzsj.com/article/cessge.html