inline关键字

内联函数与继承

基类如下:

class base  
{
public:
    base();
    virtual ~base();
  void Add(const char* pId, const char* pName);
  const char* GetId() const;   // 加inline
  const char* GetName() const; // 加inline
private:
  char m_szID[32];
  char m_szName[32];
};

派生类如下:

#include "base.h"

class course  :public base
{
public:
    course();
  virtual ~course(); 
  void Add(const char* pId, const char* pName, int iScore);
private:
  int  m_iScore;
};

派生类中隐藏了父类的add函数,派生类add函数实现如下:

void course::Add(const char* pId, const char* pName, int iScore)
{
  m_iScore = iScore;
  base::Add(pId, pName);
  cout << "Id:" << GetId() << " Name:" 
       << GetName() << " Score:" << m_iScore << endl;
}

如果我们把基类注释加inline关键字的函数加上关键字,那么派生类在使用时。会报这种错误:

course.obj : error LNK2001: unresolved external symbol "public: char const * __thiscall base::GetId(void)const " (?GetId@base@@QBEPBDXZ)
course.obj : error LNK2001: unresolved external symbol "public: char const * __thiscall base::GetName(void)const " (?GetName@base@@QBEPBDXZ)
Debug/Work2.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

在链接course.obj的时候找不到基类的这两个函数,因为内联不产生函数调用,直接产生代码替换,所以,函数被编译器优化掉了!

我们用winhex打开base.obj的中间文件。查看是否有被名称粉碎后的函数名.搜索关键字Get:

 

转载于:https://www.cnblogs.com/ziolo/archive/2013/05/14/3078931.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值