文章目录
- 一、继承的一些重要特性
- 1、子类拥有父类的所有成员
- 2、子类可以拥有父类没有的成员
- 3、多态性
- 二、代码示例
一、继承的一些重要特性
1、子类拥有父类的所有成员
子类 继承 父类 , 则 子类 拥有 父类的 所有 成员变量 和 成员函数 ;
这里要注意 : 子类 拥有 父类的 私有成员 , 但是 子类不能 直接访问 父类 的 私有成员 , 必须通过 父类的 公有或受保护 的成员函数 访问 父类的 私有成员 ;
子类 不能访问 父类的 私有成员 , 并不代表 子类 中没有 父类的 私有成员 ;
下面的 Parent 父类中 , 定义了私有成员函数 privateFun ;
如果 Child 子类 继承上述 Parent 父类 , 子类中 无法直接调用 privateFun 函数 ;
如果在父类中 , 定义一个 共有成员函数 callPrivateFun 函数 , 调用 privateFun 私有函数 ;
此时 , 在 子类中 , 可以通过调用 callPrivateFun 函数 , 间接调用 父类的 privateFun 私有函数 ;
代码示例 :
class Parent {
public:void publicFun() {cout << "父类公有成员" << endl;}void callPrivateFun(){privateFun();cout << "通过父类公有函数 调用 父类私有成员" << endl;}protected:void protectedFun() {cout << "父类保护成员" << endl;}private:void privateFun() {cout << "父类私有成员" << endl;}
};
Child 子类 继承上述 Parent 父类 , 通过 父类 callPrivateFun 函数间接调用 父类的 私有成员 ;
Child c;c.publicFunChild();// 间接调用父类的 私有成员c.callPrivateFun();
2、子类可以拥有父类没有的成员
子类 可以 在 继承自 父类 的 成员变量 和 成员函数 基础上 , 定义 其它的 成员变量 和 成员函数 ;
因此 , 子类 可以 拥有 父类 所没有的 成员变量 和 成员函数 ;
在下面的代码中 , Parent 是父类 , Child 是子类 ;
父类中有 publicFun , protectedFun , privateFun 三个成员方法 ;
子类中包含父类的所有成员 , 即包含上面的 publicFun , protectedFun , privateFun 三个成员方法 ,
此外 , 子类还在上面的基础上 , 又定义了 publicFunChild 方法 ;
class Parent {
public:void publicFun() {cout << "父类公有成员" << endl;}protected:void protectedFun() {cout << "父类保护成员" << endl;}private:void privateFun() {cout << "父类私有成员" << endl;}
};// 子类 公有继承 父类
class Child : public Parent {
public:void publicFunChild() {// 子类 可以访问 父类 的公有成员 publicFun(); // 子类 可以访问 父类 的保护成员 protectedFun();// 任何类型的继承 都不能访问 父类的私有成员//privateFun();}
};
3、多态性
子类 可以 当做 父类 使用 , 子类 是 特殊的 父类 ;
在下面的代码中 , 定义了 父类 Parent 类型的变量 , Parent c2 ;
使用 Child c 对象 , 为 Parent c2 进行初始化赋值 , 代码为 Parent c2 = c , 该操作执行正常 , 并没有报错 ;
调用 c2.publicFun() 代码 , 访问 父类的 publicFun 函数 , 该操作正常执行 ;
说明 子类对象 可以当做 父类对象 使用 ;
注意 : 如果 使用 子类对象 为 父类对象 进行初始化 , 则该对象 不能调用 子类独有的成员;
部分代码示例 : 父类 与 子类 的代码 , 参考上面的章节的 Parent 父类 和 Child 子类 代码 ;
Child c;c.publicFunChild();Parent c2 = c;c2.publicFun();// c2 不能访问子类的成员//c2.publicFunChild();
二、代码示例
代码示例 :
#include "iostream"
using namespace std;#include <iostream> class Parent {
public:void publicFun() {cout << "父类公有成员" << endl;}void callPrivateFun(){privateFun();cout << "通过父类公有函数 调用 父类私有成员" << endl;}protected:void protectedFun() {cout << "父类保护成员" << endl;}private:void privateFun() {cout << "父类私有成员" << endl;}
};// 子类 公有继承 父类
class Child : public Parent {
public:void publicFunChild() {// 子类 可以访问 父类 的公有成员 publicFun(); // 子类 可以访问 父类 的保护成员 protectedFun();// 任何类型的继承 都不能访问 父类的私有成员//privateFun();}
};int main() {Child c;c.publicFunChild();// 间接调用父类的 私有成员c.callPrivateFun();Parent c2 = c;c2.publicFun();// c2 不能访问子类的成员//c2.publicFunChild();// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
}
执行结果 :
父类公有成员
父类保护成员
父类私有成员
通过父类公有函数 调用 父类私有成员
父类公有成员
Press any key to continue . . .