虚函数理解
函数 理解
2023-09-14 09:09:31 时间
虚函数中默认参数
/**
* @file first_example.cpp
* @brief 虚函数中默认参数
* 规则:虚函数是动态绑定的,默认参数是静态绑定的。默认参数的使用需要看指针或者应用本身的类型,而不是对象的类型!
* @author 光城
* @version v1
* @date 2019-07-24
*/
#include <iostream>
using namespace std;
class Base
{
public:
virtual void fun ( int x = 10 )
{
cout << "Base::fun(), x = " << x << endl;
}
};
class Derived : public Base
{
public:
virtual void fun ( int x=20 )
{
cout << "Derived::fun(), x = " << x << endl;
}
};
int main()
{
Derived d1;
Base *bp = &d1;
bp->fun(); // 10
return 0;
}
Derived::fun(), x = 10
4.可以不可以¶
原因主要有两方面:
(1)静态函数不可以声明为虚函数,同时也不能被const 和 volatile关键字修饰
static成员函数不属于任何类对象或类实例,所以即使给此函数加上virutal也是没有任何意义
虚函数依靠vptr和vtable来处理。vptr是一个指针,在类的构造函数中创建生成,并且只能用this指针来访问它,静态成员函数没有this指针,所以无法访问vptr。
(2)构造函数可以为虚函数吗?
构造函数不可以声明为虚函数。同时除了inline|explicit之外,构造函数不允许使用其它任何关键字。
为什么构造函数不可以为虚函数?
尽管虚函数表vtable是在编译阶段就已经建立的,但指向虚函数表的指针vptr是在运行阶段实例化对象时才产生的。 如果类含有虚函数,编译器会在构造函数中添加代码来创建vptr。 问题来了,如果构造函数是虚的,那么它需要vptr来访问vtable,可这个时候vptr还没产生。 因此,构造函数不可以为虚函数。
我们之所以使用虚函数,是因为需要在信息不全的情况下进行多态运行。而构造函数是用来初始化实例的,实例的类型必须是明确的。 因此,构造函数没有必要被声明为虚函数。
(3)析构函数可以为虚函数吗?
析构函数可以声明为虚函数。如果我们需要删除一个指向派生类的基类指针时,应该把析构函数声明为虚函数。 事实上,只要一个类有可能会被其它类所继承, 就应该声明虚析构函数(哪怕该析构函数不执行任何操作)。
相关文章
- 深入理解linux下write()和read()函数
- java lamba表达式_非负简单函数表达式如何理解
- 【说站】python函数式编程如何理解
- 【scf】云函数层的理解和使用
- 【c++】【基础】【primer_plus】【第八章】 引用与模板函数
- vue 父组件调用子组件的函数_vue子组件触发父组件方法
- Scratch3.0——助力新进程序员理解程序(案例五、自制积木-五角星函数)
- 温故知新|数学:函数
- Linux进程信号(产生、保存、处理)/可重入函数概念/volatile理解/SIGCHLD信号
- PHP 中数组函数 isset 效率比 array_key_exists 更高
- Go语言匿名函数——没有函数名字的函数
- JS高阶函数精讲
- 深入理解Linux内核之Main函数(linuxmain函数)
- 函数理解Linux atoi函数的作用(linuxatoi)
- 函数 深入理解Linux中atoi函数(linuxatoi)
- 函数理解Linux atoi函数及其应用(linuxatoi)
- 函数理解Linux atoi函数的重要性(linuxatoi)
- 深入理解Linux的exit函数机制(linuxexit函数)
- 深入理解Linux中的join函数(linuxjoin)
- 「深入理解Linux关机函数」(linux关机函数)
- MSSQL数据库中ABS正值函数的应用(mssql 求正值函数)
- Oracle内置函数查询解锁更多高效操作(oracle内置函数查询)
- MySQL函数详解,解析函数在数据库中的作用及使用方法(mysql中函数是什么)
- MySQL利用函数实现上下取整差值计算(mysql上下取差值)
- 介绍Oracle中取较小值函数的应用(oracle两者取小函数)
- 深入理解JavaScript系列(2)揭秘命名函数表达式
- MySQL中group_concat函数深入理解
- JavaScript中valueOf函数与toString方法深入理解
- JavaScript回调(callback)函数概念自我理解及示例
- 深入理解C语言static、extern与指针函数
- JavaScript中的console.profile()函数详细介绍