virtual 那些事
对应的代码:emp.cpphttps://github.com/Light-City/CPlusPlusThings/tree/master/basic_con
试读章节 · 登录解锁全文
1 小时
virtual那些事
1.虚函数与运行多态
对应的代码:emp.cpp
虚函数的调用取决于指向或者引用的对象的类型,而不是指针或者引用自身的类型。
2.vptr与vtable
3.虚函数中默认参数
对应的代码:default_arg.cpp
默认参数是静态绑定的,虚函数是动态绑定的。 默认参数的使用需要看指针或者引用本身的类型,而不是对象的类型。
4.可以不可以
(1) 静态函数可以声明为虚函数吗?
原因主要有两方面:
静态函数不可以声明为虚函数,同时也不能被const 和 volatile关键字修饰
static成员函数不属于任何类对象或类实例,所以即使给此函数加上virutal也是没有任何意义
虚函数依靠vptr和vtable来处理。vptr是一个指针,在类的构造函数中创建生成,并且只能用this指针来访问它,静态成员函数没有this指针,所以无法访问vptr。
代码学习:static_error.cpp
(2)构造函数可以为虚函数吗?
构造函数不可以声明为虚函数。同时除了inline|explicit之外,构造函数不允许使用其它任何关键字。
为什么构造函数不可以为虚函数?
尽管虚函数表vtable是在编译阶段就已经建立的,但指向虚函数表的指针vptr是在运行阶段实例化对象时才产生的。 如果类含有虚函数,编译器会在构造函数中添加代码来创建vptr。 问题来了,如果构造函数是虚的,那么它需要vptr来访问vtable,可这个时候vptr还没产生。 因此,构造函数不可以为虚函数。
我们之所以使用虚函数,是因为需要在信息不全的情况下进行多态运行。而构造函数是用来初始
…