封装继承和多态
Posted dingou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了封装继承和多态相关的知识,希望对你有一定的参考价值。
1、封装
定义:将某些东西包装隐藏,让外界无法直接访问,只能通过某些特定的方式访问。
目的:增强安全性,简化编程,使用者不用了解具体的实现细节,而只是通过外部接口以及特定的访问权限来使用类的成员。
2、继承
定义:新类从已有类那里得到已有的特性;
3、多态
定义:一个接口的多种实现;
动态多态:在程序运行时才能知道调用哪个函数,父类指针或者引用能够指向子类对象调用子类函数。
非多态:
C++在编译的时候要确定每个对象调用的函数,当son的地址赋给father,C++编译器会进行类型转换,C++编译器会认为father保存的就是father的地址。
#include "pch.h" #include "string" #include <iostream> using namespace std; class Father { public: void face() { cout << "Father‘s face!" << endl; } void say() { cout << "Father say !" << endl; } }; class Son :public Father { void face() { cout << "Son‘s face!" << endl; } void say() { cout << "Son say!" << endl; } }; int main() { Son son; Father *father = &son; father->say(); }
输出结果:
多态:将父类say()函数声明为virtual;
编译器在编译时发现Father类有虚函数,此时编译器会为每个包含虚函数的类创建一个虚函数表(vtable),该表为一个一维数组用来存放虚函数的地址;同时编译器会为每个对象创建一个虚表指针(vptr),这个指针指向所属类的续表。
#include "pch.h" #include "string" #include <iostream> using namespace std; class Father { public: void face() { cout << "Father‘s face!" << endl; } virtual void say() { cout << "Father say !" << endl; } }; class Son :public Father { void face() { cout << "Son‘s face!" << endl; } void say() { cout << "Son say!" << endl; } }; int main() { Son son; Father *father = &son; father->say(); }
以上是关于封装继承和多态的主要内容,如果未能解决你的问题,请参考以下文章