一、继承的一些重要特性
1、子类拥有父类的所有成员
子类 继承 父类 , 则 子类 拥有 父类的 所有 成员变量 和 成员函数 ;
这里要注意 : 子类 拥有 父类的 私有成员 , 但是 子类不能 直接访问 父类 的 私有成员 , 必须通过 父类的 公有或受保护 的成员函数 访问 父类的 私有成员 ;
子类 不能访问 父类的 私有成员 , 并不代表 子类 中没有 父类的 私有成员 ;
下面的 Parent 父类中 , 定义了私有成员函数 privateFun ;
如果 Child 子类 继承上述 Parent 父类 , 子类中 无法直接调用 privateFun 函数 ;
如果在父类中 , 定义一个 共有成员函数 callPrivateFun 函数 , 调用 privateFun 私有函数 ;
此时 , 在 子类中 , 可以通过调用 callPrivateFun 函数 , 间接调用 父类的 privateFun 私有函数 ;
代码示例 :
代码语言:javascript复制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 函数间接调用 父类的 私有成员 ;
代码语言:javascript复制 Child c;
c.publicFunChild();
// 间接调用父类的 私有成员
c.callPrivateFun();
2、子类可以拥有父类没有的成员
子类 可以 在 继承自 父类 的 成员变量 和 成员函数 基础上 , 定义 其它的 成员变量 和 成员函数 ;
因此 , 子类 可以 拥有 父类 所没有的 成员变量 和 成员函数 ;
在下面的代码中 , Parent 是父类 , Child 是子类 ;
父类中有 publicFun , protectedFun , privateFun 三个成员方法 ;
子类中包含父类的所有成员 , 即包含上面的 publicFun , protectedFun , privateFun 三个成员方法 ,
此外 , 子类还在上面的基础上 , 又定义了 publicFunChild 方法 ;
代码语言:javascript复制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 子类 代码 ;
代码语言:javascript复制 Child c;
c.publicFunChild();
Parent c2 = c;
c2.publicFun();
// c2 不能访问子类的成员
//c2.publicFunChild();
二、代码示例
代码示例 :
代码语言:javascript复制#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;
}
执行结果 :
代码语言:javascript复制父类公有成员
父类保护成员
父类私有成员
通过父类公有函数 调用 父类私有成员
父类公有成员
Press any key to continue . . .