1 定义形式
由基类派生出派生类的定义的一般形式为
class 派生类名:访问限定符 基类名1,访问限定符 基类名2, … 访问限定符 基类名n
若只继承自一个基类,则为单继承,否则为多继承
2 编写步骤
1、吸收基类的成员 :不论是数据成员,还是函数成员,除构造函数与析构函数外全盘接收 ,这与继承属性无关,继承属性不管是公有、私有、保护,子类都会吸收父类除构造函数与析构函数外的所有成员,数据成员会占有子类空间的大小,只是不同的继承属性在子类内部对父类成员会有不同的访问权限
2、改造基类成员 :声明一个和某基类成员同名的新成员,派生类中的新成员就屏蔽了基类同名成员称为同名覆盖(override)
3、派生类新成员必须与基类成员不同名,它的加入保证派生类在功能上有所发展
4、重写构造函数与析构函数
3 继承访问属性
1、公有继承
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
// 基类
class Base
{
public:
void Show()
{
cout << "Base Show" << endl;
}
protected:
void Print()
{
cout << "Base Print" << endl;
}
private:
int x;
};
// 派生类Inherit公有继承基类Base
class Inherit:public Base
{
public:
void InShow()
{
cout << " Inherit Show" << endl;
}
protected:
void InPrint()
{
cout << "Inherit Print" << endl;
}
void fun1()
{
// 公有继承 子类内部可以访问父类的公有成员和保护成员
Show();
Print();
// error 父类的私有成员不管以何种方式继承都不能被直接访问
// 若要访问父类的私有成员,可以通过父类的公有方法或保护方法
x = 100;
}
private:
int y;
};
int main()
{
Inherit s;
// 子类对象可以公有继承访问继承自父类的公有成员,
// 对于保护成员和私有成员,不管是子类自身的还是继承而来的,都不能通过子类对象来访问
s.Show();
system("pause");
return 0;
}
2、保护继承
class Base
{
public:
void Show()
{
cout << "Base Show" << endl;
}
protected:
void Print()
{
cout << "Base Print" << endl;
}
private:
int x;
};
// 派生类Inherit保护继承基类Base
class Inherit:protected Base
{
public:
void InShow()
{
cout << " Inherit Show" << endl;
}
protected:
void InPrint()
{
cout << "Inherit Print" << endl;
}
void fun1()
{
// 保护继承 子类内部可以访问父类的公有成员和保护成员
Show();
Print();
}
private:
int y;
};
int main()
{
Inherit s;
// error 保护继承 子类对象不可以访问继承自父类任何成员
s.Show();
system("pause");
return 0;
}
3 私有继承
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
class Base
{
public:
void Show()
{
cout << "Base Show" << endl;
}
protected:
void Print()
{
cout << "Base Print" << endl;
}
private:
int x;
};
// 派生类Inherit私有继承基类Base
class Inherit:private Base
{
public:
void InShow()
{
cout << " Inherit Show" << endl;
}
protected:
void InPrint()
{
cout << "Inherit Print" << endl;
}
void fun1()
{
// 私有继承 子类内部可以访问父类的公有成员和保护成员
Show();
Print();
}
private:
int y;
};
// 私有继承的子类Inherit再往下一级继承
class Inh:public Inherit
{
public:
void fun2()
{
// error 此时基类的方法在下一级的继承的类中已经不允许访问,这是与保护继承的
// 区别,保护继承在这里还是允许访问的
Show();
Print();
}
};
int main()
{
Inherit s;
// error 私有继承 子类对象不可以访问继承自父类任何成员
s.Show();
system("pause");
return 0;
}
4 总结
继承属性:
公有继承:子类内部可以访问父类的公有成员和保护成员,子类对象可以访问父类的公有属性成员
保护继承:子类内部可以访问父类的公有成员和保护成员,但是子类对象不可以访问父类的公有属性成员,同时继承自父类的公有成员和保护成员还可以往下一级继承,孙子类可以继续访问
私有继承:子类内部可以访问父类的公有成员和保护成员,但是子类对象不可以访问父类的公有属性成员,与保护继承不同的时继承自父类的公有成员和保护成员不可以往下一级继承,后继无人啦。
访问属性:
公有属性:对于无继承的单个类来说,类内类外都可以访问,对于公有继承,子类内部和子类对象都可以访问,对于保护和私有继承,只能在子类内部访问
保护属性:对于无继承的单个类来说,只能在类内部访问,若有继承,可以通过子类的内部直接进行访问,这也是保护属性的作用体现之所在。
私有属性:对于无继承的单个类来说,只能在类内部访问,若有继承,也不可以通过子类的内部或子类对象直接进行访问,这也是区别保护属性之所在