封装:
把客观事物封装成抽象的类,并且类可以把自己的成员属性和成员方法只让可信的类或者对象操作,对不可信的进行信息隐藏
就是类将成员变量和成员函数封装在类的内部,根据需要设置访问权限,通过成员函数管理内部状态。
继承:
继承所表达的是类之间相关的关系,这种关系使得对象可以继承另外一类对象的成员属性和成员方法。
继承的作用:避免公用代码的重复开发,减少代码和数据冗余
多态:
多态性可以简单地概括为“一个接口,多种方法”,字面意思为多种形态。程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念
多态的三个条件:
1有继承
2父类指针指向子类对象
3有虚函数重写
#include<iostream>
using namespace std;
class parten
{
public:
parten()
{
age = 40;
}
virtual void test()
{
cout << "parten的年龄" << age << endl;
}
public:
int age;
};
class son:public parten
{
son()
{
age = 60;
}
virtual void test()
{
cout << "son的年龄" << age << endl;
}
public:
int age;
};
int main()
{
parten* pa = new son;
pa->test();
system("pause");
}
运行结果是调用的是son 的成员函数
为什么会调用子类的成员函数呢?
因为在类中有虚函数,编译器发现我们的类中有虚函数的时候,编译器会创建一张虚函数表,把虚函数的函数入口地址放到虚函数表中,并且在类中秘密增加一个指针,这个指针就是vpointer(缩写vptr),这个指针是指向对象的虚函数表。在多态调用的时候,根据vptr指针,找到虚函数表来实现动态绑定
子类继承父类所有子类也有指向自己的虚函数指针和虚函数表,子类没有重写虚函数的时候如下图
当子类重写了虚函数的时候入下图,子类覆盖了父类的虚函数,vptr指针指向的就是子类的test函数 ,去patrten指向的空间中寻找vptr指针,通过vptr指针找到test函数,由于子类重写基类的test函数,所以调用test时,调用的是子类的test函数
图三