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

虚函数

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个字节正好占用类对象的内存空间的

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44585751

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值