inline和virtual能够同时修饰吗

在类中定义并实现的成员函数默认为inline(内联)函数,而Inline函数又不能为虚函数,这是两个正确的结论,这位同学的疑惑是这两个
正确的结论似乎有些冲突,冲突在哪里,因为我们平时在类中定义并实现的成员函数很多都声明为虚函数,下面看代码:
// inline和虚函数冲突吗.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
using namespace std;


class A
{
public:
A()
{
}
virtual void print1() const
{
cout<<"virtual函数 or Inline 函数?"<<endl;
}

void print2() const;
};

void A::print2() const
{
cout<<"非Inline函数"<<endl;
}


int _tmain(int argc, _TCHAR* argv[])
{
A *pA = new A;
pA->print1();
pA->print2();
system("pause");
return 0;
}

从上面的代码很容易看出:
1. print1()函数声明为虚函数
2. 在类里面定义和实现,按照“在类里定义和实现的成员函数默认为inline函数”的结论,那么print1()明显应该符合,也就是说
该函数应该为inline函数
这样一来就与”inline函数不能声明为虚函数“的结论相违背了,到底是哪里出了问题?
C++的每一条规则和技巧都是有来头的,“在类里定义和实现的成员函数默认为inline函数”,这条结论的前提就是该函数不能声明为虚函数,否则该结论不成立,从这个角度来看,virtual和inline确实是冲突的。

下面从背后的原理说说为什么virtual和inline存在冲突,其实稍微一想就应该知道:
inline是内联函数,内联函数的意思就是在调用该函数的时候将该函数的代码展开并加以替换,这样就省去了函数调用(进栈 出栈等)的开销,不过inline函数如果代码过长,那么调用次数一多,势必整个程序的代码量会膨胀,这样也是不行的,哎呦,扯远了,呵呵。总之inline函数是将该函数的代码展开到调用该函数的地方,所以inline函数是没有地址的。

virtual函数的调用时在程序运行时根据调用函数的对象时父类对象还是子类对象来决定该调用哪一个虚函数,其中的原理就是通过vptr,vtbl等实现的,vptr指向vtbl中的虚函数,vbtl保存了虚函数的地址入口,所以每个虚函数都有个地址,这个地址保存在对应的虚函数表中,这个显然与inline函数没有地址是相违背的,所以inline和virtual是存在冲突的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值