网站首页 > 基础教程 正文
先说结论:C++的虚函数可以是内联函数。但 inline virtual 唯一可以内联的时候是编译器知道所调用的对象是哪个类。
1、虚函数和内联函数
虚函数:类成员函数前面添加virtual关键字,则该函数被称为虚函数。
虚函数是为了实现多态机制,需要在基类中定义虚函数。多态,就是用基类型别的指针指向其派生类的实例,然后通过基类的指针调用实际派生类的成员函数。这种技术可以让基类的指针有“多种形态”。
内联函数:在函数前面添加inline关键字,则该函数被称为内联函数。
内联函数在调用时并不通过函数调用的机制,而是通过将函数体直接插入调用处来实现的,这样可以大大减少由函数调用带来的开销,从而提高程序的运行效率。
需要注意的是:inline声明对编译器来说只是一种建议,编译器可以选择忽略这个建议。比如将一个1000多行的函数指定为inline,编译器就会忽略这个inline,将这个函数还原成普通函数。
因此,并不是说把一个函数定义为inline函数就一定会被编译器识别为内联函数,具体取决于编译器的实现和函数体的大小。
2、代码示例
比如下面这段代码:
- 当使用类的对象来调用时,则虚函数可以当做是内联的,因为编译器在编译时就确切知道对象是哪个类的;
- 但当使用基类指针或引用来调用虚函数时,它都不能是内联函数,因为调用发生在运行时,是动态绑定的。
#include <iostream>
using namespace std;
class Base {
public:
inline virtual void Display() {
cout << "Base: Display" << endl;
}
};
class Derived : public Base {
public:
inline virtual void Display() {
cout << "Derived: Display" << endl;
}
};
int main()
{
// 这里的虚函数是通过具体对象调用的, 可以是内联的
Base b;
b.Display();
// 这里的虚函数是通过基类指针调用的, 不能是内联的
Base* bp = new Derived();
bp->Display();
delete bp;
bp = nullptr;
return 0;
}
运行结果:
猜你喜欢
- 2024-11-12 金三银四不跳槽更待何时?安卓开发1年字节5面面经,已成功上岸
- 2024-11-12 C++要学到什么程度才能找到实习? c++学完学什么
- 2024-11-12 C++基础语法梳理:inline 内联函数!虚函数可以是内联函数吗?
- 2024-11-12 C++基类中虚析构函数 c++ 虚析构函数
- 2024-11-12 C和C++代码精粹:C语言和C++有什么区别么?
- 2024-11-12 3个面试C++开发岗位的高频笔试题 c++软件开发面试
- 2024-11-12 一文在手,"类间关系"不再困惑
- 2024-11-12 c++的面试总结 c++面试知识点
- 2024-11-12 C++ 虚函数 实例学习 简单易懂 c++虚函数的使用
- 2024-11-12 C++里面的虚析构函数 虚构造函数与虚析构函数
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)