成员函数既是inline又是virtual类型

inline类型表示在编译时期进行函数展开,用函数体在函数调用出代替函数的调用;而vitual是c++多态的必要条件,但是要想表现出多态,必须要等到运行时,才知道真正调用的是哪一个函数。表面上看这两个关键字如果同时使用,会产生错误,但不会的。

先简单说一下虚表的机制:多态的实现是由虚表加以支持的,凡是有虚函数的对象,都会在构造函数开始时构造一个虚表,虚表中的第一个元素一般是对象的类型信息,其他每个元素存放的是真正函数的地址,如果子类覆盖了父类的虚函数,则对应的位置中的地址就会被修改,但是同一个函数在虚表中的位置即下标是相同的。当我们用基类指针或者引用调用一个虚函数时,在编译期只知道该函数在某个虚表的第几个位置,但是不知道是父类的虚表还是子类的虚表,只有到运行时才能确定是哪一个虚表,从而表现出多态。但如果你不是使用基类的指针或者引用调用虚函数,或者你调用的不是虚函数,则在编译期间就可以直接找到成员函数的地址,不需要等到运行时才确定,因为此时,调用者是哪个对象已经确定,从而该函数的地址也是确定的。

根据上面的描述,虽然virtual所代表的多态类型是要在运行时确定的,但是如果调用者不是基类的指针或者引用,则该virtual的地址会在编译期间就确定,因而此时可以用inline进行展开。即使使用了基类的指针或引用进行调用,也不会产生错误,此时inline将不会展开,但virtual仍然表现出多态,因为inline毕竟只是建议,而不是强制,所以两者不矛盾。

时间: 2024-10-10 23:40:04

成员函数既是inline又是virtual类型的相关文章

Effective C++ Item 45 运用成员函数模板接收所有兼容类型

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:请使用 member function templates(成员函数模板)生成"可接受所有兼容类型"的函数 示例:泛化 copy 构造函数 temmplate<typename T> class SmartPtr{ public: template<typename U> SmartPtr(const SmartPtr<U> &o

C++类的成员函数(在类外定义成员函数、inline成员函数)

类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private(私有的).public (公用的)或protected(受保护的). 在使用类函数时,要注意调用它的权限(它能否被调用)以及它的作用域(函数能使用什么范围中的数据和函数).例如私有的成员函数只能被本类中的其它成员函数所调用,而不能被类外调用.成员函数可以访问本类中任何成员(包括私有的和公用的),可

Effective C++ 条款45 运用成员函数模板接受所有兼容类型

1. "智能指针"是行为像指针的对象,但它们能提供指针没有的功能:shared_ptr,weak_ptr,auto_ptr(见条款13)实现对堆内存的自动管理,STL的迭代器实现对整个容器的遍历等. 真正的指针的优势在于支持继承层次中派生类指针向基类指针的转换(当然标准库shared_ptr,weak_ptr,auto_ptr等已实现). 2. 由于同一template的不同具现体之间没有直接联系,也就是说对于自定义的智能指针(假设名为SmartPtr),如果不额外采取手段支持基层层次

C++面向对象—成员函数与成员变量的实现机制学习笔记(1)

<深度搜索C++对象模型>的一些学习纪要: 原文链接:ordeder   http://blog.csdn.net/ordeder/article/details/26396989 一成员变量篇 0. 类的编译中,先编译成员变量和成员函数的额声明,成员函数的定义在类声明结束后再处理: 1. 类中,多个代码区块public或者private最终会被按区块统一,然后编译过程中,后定义的成员变量地址高于定义的成员变量: 2. 静态变量在程序启动时初始化,存储的位置在于程序的全局数据段中: 3. 继承

类 this指针 const成员函数

C++ Primer 第07章 类 7.1.2 ?Sales_data类的定义如下: #ifndef SALES_DATA_H #define SALES_DATA_H #include <string> #include <iostream> class Sales_data { public: std::string isbn() const {return bookNo;} Sales_data& combine(const Sales_data&); dou

类 this指针 const成员函数 std::string isbn() const {return bookNo;}

转载:http://www.cnblogs.com/little-sjq/p/9fed5450f45316cf35f4b1c17f2f6361.html C++ Primer 第07章 类 7.1.2 ?Sales_data类的定义如下: #ifndef SALES_DATA_H #define SALES_DATA_H #include <string> #include <iostream> class Sales_data { public: std::string isbn

C++常成员函数 - const 关键字

转自:http://www.cnblogs.com/this-543273659/archive/2011/07/18/2109922.html 一.常成员函数详解 声明:<类型标志符>函数名(参数表)const: 说明: (1)const是函数类型的一部分,在实现部分也要带该关键字. (2)const关键字可以用于对重载函数的区分. (3)常成员函数不能更新类的成员变量,也不能调用该类中没有用const修饰的成员函数,只能调用常成员函数. A.通过例子来理解const是函数类型的一部分,在实

在类的成员函数中调用delete this

在类的成员函数中能不能调用delete this?答案是肯定的,能调用,而且很多老一点的库都有这种代码.假设这个成员函数名字叫release,而delete this就在这个release方法中被调用,那么这个对象在调用release方法后,还能进行其他操作,如调用该对象的其他方法么?答案仍然是肯定 的,调用release之后还能调用其他的方法,但是有个前提:被调用的方法不涉及这个对象的数据成员和虚函数.说到这里,相信大家都能明白为什么会这样 了. 根本原因在于delete操作符的功能和类对象的

常成员函数

使用const关键字进行说明的成员函数,称为常成员函数.只有常成员函数才有资格操作常量或者常对象,没有使用const关键字说明的成员函数不能用来操作常对象.常成员函数说明格式如下: <类型说明符> <函数名> (<参数表>) const; 其中,const是加在函数说明后面的类型修饰符,它是函数类型的一个组成部分,因此,在函数实现部分也要带const关键字 #include "R.h" #include <iostream> using