欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

虚函数、纯虚函数---面试常考点

程序员文章站 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个字节正好占用类对象的内存空间的

上一篇:

下一篇: