虚函数、纯虚函数---面试常考点
程序员文章站
2023-12-31 20:51:22
...
虚函数
1、虚函数 :是在基类中使用关键字 virtual 声明的函数。
2、派生类中重新定义基类中定义的虚函数时,会告诉编译器不要 静态链接 到该函数,在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为 动态链接 ,或 后期绑定。
3、虚函数必须是 非静态 的成员函数,虚函数经过派生之后,就可以实现运行过程中的 多态。
4、虚函数有具体的代码实现过程,否则会报未定义的错误。
5、虚函数的引入,主要是为了实现多态
1、虚函数定义:
class People
{
public:
virtual void printf(void)
{
cout << "from class People" << endl;
}
};
class Man : public People //公有继承People类
{
public:
void printf(void)
{
cout << "from Man class" << endl;
}
};
int main(void)
{
People peo;
Man man;
peo.printf();
man.printf();
}
输出结果:
from class People
from Man class
2、虚函数表
1、在一个类中,当至少存在一个虚函数的时候,在编译期间,编译器就会为类A生成一个虚函数表(virtual table )。
2、这个虚函数表会一直伴随着类A,经过编译、链接直到生成一个可执行文件。
3、这个类A以及伴随类A的虚函数表,都会保存在整个可执行文件之中。
4、在这个可执行文件执行的时候,也会被一并装载到内存中来。
纯虚函数
1、纯虚函数是一种特殊的虚函数,在一些情况下,虚函数不能实现的一些函数,需要在派生类
中进行实现的函数,叫做纯虚函数。
2、纯虚函数一般没有代码实现部分。如
virtual void fun() = 0;
class A{
public:
virtual void fun() = 0;//纯虚函数
};
纯虚函数表指针
1、含有纯虚函数的类,被称为抽象类,而抽象类不能实例化对象。
2、纯虚函数必须在子类中实现才可以调用,因为抽象基类中,纯虚函数在派生基类中只有声明,没有定义。
3、当一个或多个虚函数加入类中之后,编译器就会向类中插入一个看不见的成员变量,在类中,这个看不见的成员变量就类似以下伪代码
class A
{
public:
void *vptr; //虚函数表指针 (virtual table pointer)
……
};
这个看不见的成员变量有一个名字叫:虚函数表指针
这个虚函数表指针正好是8个字节,而这8个字节正好占用类对象的内存空间的