注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

C++小知识63——语法糖和纯虚函数的注意点  

2015-06-09 20:41:30|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
C++小知识63——语法糖和纯虚函数的注意点
         语法糖,英文是syntactic sugar,原来一直没注意它的意思,只是固定的将它定义成了一个类似固定符号的东西,今天读《C++编程思想》,上面把运算符的重载这种语法糖,翻译成了“语法上的方便”,而在词典上一般译成“语法上的甜头”,顾名思义,这才真得明白为什么大老外把这类东西叫语法糖,包括在C++11中对Lambada表达式也称做是语法糖,在语法上给你个小好处,小甜头,让你吃着方便,品着顺心。原来这才是人家真正的意思。
          另外在其第15章“多态和虚函数”中它提到“注意,纯虚函数禁止对抽象类的函数以传值方式调用。这也是防止对象切片的一种方法,通过抽象类,可以保证在向上类型转换期间总是使用指针或者引用”。这里切片(Object Slicing)是什么含义呢?其实也很简单。就是在定义一个父类和一个子类时,如果你在调用函数时采用了传值的方法,那么大家都知道,是无法形成多态的,最终只是会调用父类的方法或者说函数。那应用到普通的继承里至少还不能说语法上有错误。毕竟可以编译运行。但是有纯虚函数的类就是抽象类,而抽象类一般是不允许形成实例对象的,这样你在调用纯虚类的父类对象时,编译器就会阻止你,同时报出一个错误。或者你干脆可以理解,如果可以使用的话,就会与纯虚函数存在的意义相悖(即抽象类不能生成实例对象)。
         但是实际情况是一种什么情况呢?其实就是上面讲的切片,如果你使用非指针或者引用传递子对象的话,但是其传递参数为父对象,那么编译器只会拷贝与父对象大小的数据到参数,从而导致你的实际情况与想象不同,这些话说起来有些别扭,实际就是无法形成多态,看下面的代码就明白什么是切片了:

class Base
{
public:
virtual void GetData(){return d;}
private:
int d;
};
class Derived:public Base
{
public:
void GetData(){return d;}
private:
int d;
};
void GetDataFromBase(Base b)
{
int tmp = b.GetData();
}
int main()
{
Base b;
        Derived d;
GetDataFromBase(b);
GetDataFromBase(d);
}

发现C++越是学习越难,怪不得人家都不愿意学这个。付出的学习成本和得到的回报严重不成正比,现在的人根本不会再努力去学。
  评论这张
 
阅读(330)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017