C++赋值兼容规则和类类型转换注意事项之一

原创 2013年12月06日 00:47:29
class B
{
public:
    B() { }
public:
    int num_;
};

class Son:private B     //这里为private继承和protected继承对于本文要说明的问题的效果是一样的
{
public:
    Son(){};
    ~Son(){};

};


Son son;
Son* pson = &son;


//c++风格的类类型转换

B* pb = dynamic_cast<B*>(pson);   -------编译出错
pb = static_cast<B*>(pson);              -------编译出错

//赋值兼容规则的三种形式

B b = son;           -------编译出错
B* pb = &son;    -------编译出错
B &ref = son;     -------编译出错


而只需要将上面的class Son:private B继承改为共有继承class Son:public B,则上述出错的代码就都能正常工作了。为什么?

这个就需要从继承的含义来说起了。

对于public继承,基类的public成员在派生类中依然是public的,故对用户是可见的,通过一个派生类的实例是仍然访问到这些base的public成员。而用户通过一个base类实例也只能访问到publc部分,故将一个派生类转换成为一个base类是合理的,它没有改变派生类中的base类成员对外的可见性。

对于protected或private继承,base类中的public部分在派生类中为protected或是private,那么通过一个派生类的实例是无法访问到派生类中的base类的public成员。
如果将这种派生类能合法地转换成base类,则可以通过base类实例来访问派生类中base类的public成员了。这明显是破坏了派生类中的base类的public成员对外的可见性了,当然不合法了。要不然的话,通过一个private或protected的派生类实例无法访问到base类的public成员,我只需要通过转换成base类就可以访问了呢。这样的话,不同类型的派生类中对基类成员的可见性的设置就毫无意义了。


结案陈词:

c++的赋值兼容规则和类类型转换只适用于public方式的派生类和它对应的base类。



相关文章推荐

【总结】C++基类与派生类的赋值兼容规则

在初步探索了C++继承的语言特性之后,总结下其赋值兼容规则:1.子类对象可以赋值给父类对象(切割/切片)    在公有继承的前提下,子类是可以赋值给父类对象的,为什么是共有继承(public),因为公...
  • pawnsir
  • pawnsir
  • 2016年05月28日 18:35
  • 441

C++赋值兼容原则

C++赋值兼容原则 赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员,而且所有成员的访问控制属...
  • tyegong
  • tyegong
  • 2013年08月27日 17:23
  • 657

C++赋值兼容原则理解

–赋值兼容原则(派生类对象是基类对象,反之不成立)–基类指针强制转换成派生类指针–派生类中重定义基类成员(同名覆盖) 假设, 一个基类 "普通人", 一个派生类 "超人". 1) 赋值兼容原...

C++ 强制类型转换和赋值中的类型转换

强制类型转换原C语言的形式:(类型名)(表达式)比如:(double)a //把a转换为double类型 (int)(a+b) //把a+b的值转换为整型需要注意的是:如果强制类型转换的对象是一个...

【C++注意事项】1 数据类型及类型转换

如何选择类型1)当数值不可能为负时,选择无符号类型。2)当数值超过了int的表示范围时,选用long long。3)在算术表达式中不要使用char或bool,只有在存放字符串或布尔值时才使用它们。因为...
  • NoMasp
  • NoMasp
  • 2015年05月20日 18:56
  • 2283

JAVA基本数据类型转换的主要内容和注意事项

JAVA基本数据类型转换JAVA不像PHP,JS,Python,是一门强类型语言,强类型语言就必定会涉及不少的强制类型转换,作为基础中的基础,有必要先熟悉JAVA的基本数据类型转换 本博文主要分为以...

神文,apns推送后台注意事项,证书类型转换等

首先创建Certificate Signing Request(也就是CSR)的请求文件。这个文件最好保留起来,以后证书过期了只要再次用它生成对应证书。若丢失,一旦证书过期用这个文件生成的证书则需要全...
  • ttomqq
  • ttomqq
  • 2015年09月10日 11:33
  • 1117

【C++】类型强制转换的注意事项

C++ 在设计中一直强调类型安全,而且也采取了一定的措施来保障这条准则的执行。但是,从C继承而来的强制转型却破坏了C++类型系统,C中的强制转型可谓是“无所不能”,其超强的能力给C++带来了很大的安全...
  • yhhwatl
  • yhhwatl
  • 2014年04月22日 11:12
  • 1176

C++中的类型转换规则

:任何一个操作符在运算之前其操作数的类型必须一致,如果不一致必须进行类型转换,对不同类型之间的转换规则总结如下: (1)整型提升:   在算术运算中,对于所有比int型小的整型,包括char,si...
  • zdplife
  • zdplife
  • 2016年03月18日 13:20
  • 335

浮点数初探及C++类型转换规则

浮点数初探:浮点数在计算机中如何表示,浮点数的内存占用和表示范围。C++中类型转换规则:初始化和赋值、列表初始化、表达式中的转换、参数传递、强制类型转换、整型提升...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++赋值兼容规则和类类型转换注意事项之一
举报原因:
原因补充:

(最多只允许输入30个字)