c++继承详细总结

一.概念
继承是面向对象程序中使代码可以复用的重要手段,他允许程序员在原有类的基础上进行扩展开辟新的功能。通过继承联系在一起的类构成一种层次关系。通常在层次关系的根部有一个基类,其他类则直接或间接的从基类继承而来,这样的类称为派生类。
单继承时派生类的定义

class base1//:基类
{
	//:成员声明
};
class base2 :public base1//:派生类,继承方式public
{
	base2();
	~base2();
};

多继承时派生类的定义

//:注意每一个继承方式只用于限制紧随其后的基类的继承
class derived :public base1,public base2//:派生类,继承方式public
{
	derived();
	~derived();
};

经过继承后派生类的对象包含什么?
1.吸收基类成员(默认情况下,派生类吸收了基类中出构造和析构函数之外的所有成员。c++11中规定可用using表示连基类中的构造函数都继承了过来)
2.改造基类成员(如果派生类中声明了一个和基类同名的成员,则表示基类的同名成员被覆盖了)
3.增加新成员(增加新的成员和数据,派生的意义所在)
二.继承方式简介
1.不同的继承方式的影响体现在:派生类成员对基类成员的访问权限。通过派生类对象对基类成员的访问权限。
2.继承方式:
2.1:公有继承
访问控制:基类中的public和protected:访问属性在派生类中保持不变
private:不可直接访问。
访问权限:派生类的成员函数可以访问基类中的public和protected成员,但不能访问基类中的private成员。通过派生类的对象只能访问基类的public成员
2.2:私有继承
访问控制:基类中的public和protected:在派生类中都是private的身份出现
private:不可直接访问
访问权限:派生类的成员函数可以访问基类中的public和protected成员,但不能访问基类的private成员。通过派生类的对象不能访问基类继承的任何成员
2.3:保护继承
访问控制:基类中的public和protected:在派生类中都是protected的身份出现
private:不可直接访问
访问权限:派生类的成员函数可以访问基类中的public和protected成员,但不能访问基类的private成员。通过派生类的对象不能访问基类继承的任何成员
三.派生类和基类的类型转换
1.派生类的对象可以被当做基类的对象使用,反之则不可
2.通过基类对象名,指针,只能使用从基类继承的成员
四.派生类的构造函数
1.默认情况下,基类的构造函数不被继承。虽然用using可以继承基类的构造函数,但是派生类一般都有自己新增的成员。
2.派生类需要写自己的构造函数。
3.派生类新增成员:自定义构造函数初始化
派生类继承来的成员:调用基类构造函数初始化
派生类的构造函数需要给基类的构造函数传递参数

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class A
{
public:
	A();//:无参构造函数
	A(int i);//:带参构造函数
	~A();
	void print()const;
private:
	int a;
};
A::A()
{
	a= 0;
	cout << "调用A的无参构造函数" << endl;
}
A::A(int i)
{
	a = i;
	cout << "调用A的构造函数" << endl;
}
A::~A()
{
	cout << "调用A的析构函数" << endl;
}
void A::print()const
{
	cout << a << endl;
}
class B :public A
{
public:
	B();
	B(int i,int j);//:派生类的带参构造函数,需要给基类传值
	~B();
	void print()const;
private:
	int b;
};
B::B()
{
	b = 0;
	cout << "调用B的无参构造函数" << endl;
}
B::B(int i,int j):A(i), b(j)
{
	cout << "调用B的构造函数" << endl;
}
B::~B()
{
	cout << "调用B的析构函数" << endl;
}
void B::print()const
{
	A::print();
	cout <<b<< endl;
}
int main()
{
	B obj(5, 6);//:需要给基类传值
	obj.print();
	return 0;
}

五.派生类的拷贝构造函数
1.若派生类没有定义拷贝构造函数
编译器会生成一个默认的拷贝构造函数
先调用基类的拷贝构造函数
再为新增成员执行复制
2.若派生类定义了拷贝构造函数
一般都要为基类的拷贝构造传递参数
拷贝构造函数只能接收一个参数,既用来初始化派生类定义的成员,也被用来给基类的拷贝构造函数传递参数
基类拷贝构造函数的形参类型是基类对象的引用,实参可以是派生类对象的引用
例如:B::B(const &b):A(b){}
六.派生类的析构函数
1.析构函数不被继承
2.声明方式与普通类的析构函数相同
3.先执行派生类的析构函数体,再调用基类的析构函数
七.虚基类
1.需要解决的问题
当派生类从多个基类派生,而这些基类又有共同的基类,则在访问此共同基类成员时,会产生冗余,并有可能因为冗余带来不一致问题
2.虚基类声明
以virtual说明继承方式
calss b1: virtual public b
3.作用:主要解决继承时同一基类多次继承而产生的二义性问题。
为最远派生类提供唯一的基类成员,而不重复发生多次复制
4.注意:在第一次继承时就要将共同基类设置为虚基类。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值