1.虚函数
用virtual修饰的成员函数叫做虚函数
虚函数对类的影响是增加了一个指针的内存,也就是占了4个字节
不管有几个虚函数,都只占一个指针的内存大小
在类里 如无任何数据的情况下 类大小为1个字节(用于标识为类)
类中出现一个虚函数的时候(为4个字节)
#include<iostream>
using namespace std;
class Fox
{
public:
protected:
};
class Fox2
{
public:
virtual void print1()
{
cout << "虚函数 " << endl;
}
protected:
};
int main()
{
cout << sizeof(Fox) << endl;//占1个字节
cout << sizeof(Fox2) << endl;//4个字节
while (1);
return 0;
}
虚函数表: 就是一个指针存储所有虚函数的首地址
简单来说就是我们一个类中无论存在多少个虚函数,它的大小并未改变,也就是说
我们可以理解为虚函数为指针调用,类似于C语言的函数指针,指向了这个虚函数
调用了这个虚函数。
#include<iostream>
using namespace std;
class Fox
{
public:
protected:
};
class Fox2
{
public:
virtual void print1()
{
cout << "虚函数 " << endl;
}
virtual void print2()
{
cout << "虚函数2" << endl;
}
protected:
};
int main()
{
cout << sizeof(Fox) << endl;//占1个字节
cout << sizeof(Fox2) << endl;//4个字节
Fox2 fox;
int** pfox = (int**) &fox;
typedef void(*PF)();
PF pfunc = (PF) pfox[0][0];
pfunc();//调用虚函数1
pfunc= (PF)pfox[0][1];
pfunc();//调用虚函数2
while (1);
return 0;
}
2.虚函数和多态
多态 同一种行为(调用)产生的不同结果,我们称之为多态
多态必要原则:父类中必须存在虚函数
子类必须采用公有继承的方式,必须存在指针类的使用
#include<iostream>
#include<string>
using namespace std;
class Fox
{
public:Fox(string name) :name(name) {};
virtual void coutname()//我们称成员函数为行为
{
cout << name << endl;
}
protected:
string name;
};
class FoxSon:public Fox
{
public:FoxSon(string Sname = "",string Fname="") :name(Sname), Fox(Fname) {};
void coutname() //不用再加入关键字 virtual
{
co