虚函数总结:
虚函数的作用:让一个基类的指针在不知道指向哪个子类的时候能够正确的调用被重载的函数
原理:为了说明虚函数的原理,首先得知道继承的原理,继承其实就是把基类的成员按照继承的方式(public/private)被子类所包含,
实际上子类的第一个成员变来并不是实际包含在子类中的成员变量,而是继承基类所来的成员变量
比如说:
class father
{
public:
int a;
};
class son1 : public father
{
public:
int b;
};
son1类的第一成员变量是 int a; 而不是int b;
即:son1类有两个成员变量 int a 和 int b;
知道了继承的原理,再来说明虚函数:
因为子类会把基类的虚函数一起继承过去,虚函数相当于是一个指针,每个子类都会有基类的这个虚函数
例如:
class father
{
public:
int a;
virtual void status()
{
cout << "我是父亲类!" << endl;
}
};
class son1 : public father
{
public:
int b;
virtual void status()
{
cout << "我是大儿子类!" << endl;
}
};
class son2 : public father
{
public:
int c;
virtual void status()
{
cout << "我是小儿子类!" << endl;
}
};
按照上面说的,son1类实际上有四个成员,基类的 int a; 和 基类的:virtual void status() 和 自己的 int b; 和 virtual void status()
在C++中,如果创建了virtual,那么子类就会把自己的 void status()函数的内存地址存在 从基类那里继承来的virtual void status()中,
此时,当你基类的指针调用函数status时,其实还是调用自己的status函数,只不过,如果此时该指针指向的是son1类,那么son1类的函数
运行结果:
虚函数的作用:让一个基类的指针在不知道指向哪个子类的时候能够正确的调用被重载的函数
原理:为了说明虚函数的原理,首先得知道继承的原理,继承其实就是把基类的成员按照继承的方式(public/private)被子类所包含,
实际上子类的第一个成员变来并不是实际包含在子类中的成员变量,而是继承基类所来的成员变量
比如说:
class father
{
public:
int a;
};
class son1 : public father
{
public:
int b;
};
son1类的第一成员变量是 int a; 而不是int b;
即:son1类有两个成员变量 int a 和 int b;
知道了继承的原理,再来说明虚函数:
因为子类会把基类的虚函数一起继承过去,虚函数相当于是一个指针,每个子类都会有基类的这个虚函数
例如:
class father
{
public:
int a;
virtual void status()
{
cout << "我是父亲类!" << endl;
}
};
class son1 : public father
{
public:
int b;
virtual void status()
{
cout << "我是大儿子类!" << endl;
}
};
class son2 : public father
{
public:
int c;
virtual void status()
{
cout << "我是小儿子类!" << endl;
}
};
按照上面说的,son1类实际上有四个成员,基类的 int a; 和 基类的:virtual void status() 和 自己的 int b; 和 virtual void status()
在C++中,如果创建了virtual,那么子类就会把自己的 void status()函数的内存地址存在 从基类那里继承来的virtual void status()中,
此时,当你基类的指针调用函数status时,其实还是调用自己的status函数,只不过,如果此时该指针指向的是son1类,那么son1类的函数
地址会被存在基类的status中,那么调用的就是son1类的函数
#include<iostream>
#include<string>
using namespace std;
class father
{
public:
//纯虚函数: virtual void status() = 0;
//不是纯虚函数
virtual void status()
{
cout << "我是父亲类!" << endl;
}
};
class son1 : public father
{
public:
virtual void status()
{
cout << "我是大儿子类!" << endl;
}
};
class son2 : public father
{
public:
virtual void status()
{
cout << "我是小儿子类!" << endl;
}
};
int main()
{
father *p = new son1;
p->status();
return 0;
}
运行结果: