封装继承和多态

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();
}

技术分享图片

 

以上是关于封装继承和多态的主要内容,如果未能解决你的问题,请参考以下文章

C++的三大特性封装继承和多态

封装,继承,多态

Java基础知识回顾之三 ----- 封装继承和多态

Java基础知识回顾之三 ----- 封装继承和多态

面向对象的三大特性:继承封装多态

三大特性:封装,继承,多态