面向对象的三大特征:
封装,多态,继承
前面我们已经讲了继承的一些知识点,在这基础上,我们讲的时候再涉猎一些多态的只是。
下面我们先接着上次讲有虚函数的菱形虚继承
前面我们已经讲了继承的一些知识点,在这基础上,我们讲的时候再涉猎一些多态的只是。
下面我们先接着上次讲有虚函数的菱形虚继承
首先什么是虚函数。?
虚函数:在类里面,函数前面有virtual关键字的成员函数就是虚函数。
代码块:
代码块:
class base
{
public:
base()
{
cout << "base()" << endl;
}
~base()
{
cout << "~base()" << endl;
}
virtual void dis()//加了关键字virtual,dis就成了虚函数
{
cout << "pub=" << pub;
cout << " pro=" << pro;
cout << " pri=" << pri << endl;
}
int pub;
protected:
int pro;
private:
int pri;
};
我们先讲几个知识点:
1.虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。
2.在一个类中, 成员函数有虚函数的话,那么,这个对象的前四个字节一定是存放一个指向这个虚函数表(简称虚表) 的指针。虚表里面放的是虚函数的地址
3.对于菱形继承这样,有 多个基类的类对象,则会有多个虚表,每一个基类对应一个虚表,同时,虚表的顺序和继承时的顺序相同。
4.即使是存在虚基类指针, 虚表指针也是在虚基类指针的上方,这是为了保证正确取到虚函数的偏移量。
1.虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。
2.在一个类中, 成员函数有虚函数的话,那么,这个对象的前四个字节一定是存放一个指向这个虚函数表(简称虚表) 的指针。虚表里面放的是虚函数的地址
3.对于菱形继承这样,有 多个基类的类对象,则会有多个虚表,每一个基类对应一个虚表,同时,虚表的顺序和继承时的顺序相同。
4.即使是存在虚基类指针, 虚表指针也是在虚基类指针的上方,这是为了保证正确取到虚函数的偏移量。
举个简单的例子
代码块:
代码块:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<stdio.h>
using namespace std;
class base
{
public:
base(int a=1,int b=2,int c=3)
: pub(a)
, pro(b)
, pri(c)
{
cout << "base()" << endl << endl;
}
~base()
{
cout << "~base()" << endl << endl;
}
virtual void dis()//加了关键字virtual,dis就成了虚函数
{
cout << "dis()" << endl<<endl;
cout << "pub=" << pub;
cout << " pro=" << pro;