内联函数、构造函数、静态成员函数不可以定义为虚函数?

多态,即多种状态(形态)。简单来说,我们可以将多态定义为消息以多种形式显示的能。
多态是以封装和继承为基础的。
C++ 多态分类及实现:
i. 重载多态(Ad-hoc Polymorphism,编译期):函数重载、运算符重载
ii. ⼦类型多态(Subtype Polymorphism,运⾏期):虚函数
iii. 参数多态性(Parametric Polymorphism,编译期):类模板、函数模板
iv. 强制多态(Coercion Polymorphism,编译期/运⾏期):基本类型转换、⾃定义类型转换



静态多态(早绑定)
函数重载

class A
{
  public:
    void do(int a);
    void do(int a, int b);
};

动态多态(晚绑定)
虚函数:⽤ virtual 修饰成员函数,使其成为虚函数
注意:

  1. 普通函数(类成员函数)不能是虚函数
  2. 静态函数(static)不能是虚函数
  3. 构造函数不能是虚函数(因为在调⽤构造函数时,虚表指针并没有在对象的内存空间中,必须要构造函数调用完成后才会形成虚表指针)
  4. 内联函数不能是表现多态性时的虚函数,

简而言之,成员函数实例相关,静态函数类相关。虚函数,是一种特殊的成员函数,用来实现运行时多态。

静态成员函数,可以不通过对象来调用,没有隐藏的this指针。virtual函数一定要通过对象来调用,有隐藏的this指针。
所以,关键问题是

static成员没有this指针。static function 是静态决议(编译的时候就绑定了)

而virtual function 是动态决议的(运行时才绑定)
 


内联函数、构造函数、静态成员函数不可以定义为虚函数

  1. 内联函数是编译时展开函数体,所以在此时就需要有实体,而虚函数是运行时才有实体,所以内联函数不可以为虚函数。
  2. 静态成员函数是属于类的,不属于任何一个类的对象,可以通过作用域以及类的对象访问,本身就是一个实体,所以不能定义为虚函数。
  3. 如果构造函数定义为虚函数,则需要通过查找虚函数表来进行调用。但是构造函数是虚函数的情况下是找不到的,因为构造函数自己本身也不存在,创建不了实例,没有实例化对象,则类的成员不能被访问。
     

 

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值