封装、继承和多态

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

原文地址:https://www.cnblogs.com/dingou/p/10274816.html