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++赋值兼容规则和多态

赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员,而且所有成员的访问控制属性也和基类完全相同。这样,公有派生...
  • nodeathphoenix
  • nodeathphoenix
  • 2012年01月09日 23:13
  • 3061

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

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

C++赋值兼容原则

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

C++赋值兼容原则理解

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

C++继承详解一 ——继承、继承关系、赋值兼容规则、作用域

C++是一门面向对象的编程语言(OOP),它有三大特性:封装,继承,多态。 今天我来主要详解一下继承。 一,继承概念: 继承机制(inheritance)是面向对象程序设计中使代码可以复用的最重...
  • Pg_dog
  • Pg_dog
  • 2017年03月30日 13:30
  • 553

继承中的支配规则和赋值兼容规则

C++的支配规则就是这样: ★在基类和派生类有重名(但可以访问)的成员时,优先派生类的成员 ★如果要访问基类成员,必须加上作用域符:: ★私有(private)成员连派生类也不可以访问,只有本类和友类...
  • HighKit
  • HighKit
  • 2013年04月09日 11:06
  • 776

[c++基础] 四种类型转换和隐式类型转换

static_cast( expression )   用于数值类型之间的转换,也可以用于指针之间的转换,编译时已经确定好,效率高,但须要自己保证其安全性。 (1)用于数值之间的转化, 可以在相关指...
  • qq_26304333
  • qq_26304333
  • 2017年04月05日 15:40
  • 311

c++赋值兼容规则

赋值兼容规则是指在需要父类对象的地方可以使用子类对象来代替:   通过public继承,子类得到了父类除构造/析构函数之外的所有成员,且所有成员的访问属性和父类的完全相同。这样,public继承的子类...
  • qq_29344757
  • qq_29344757
  • 2017年11月11日 09:03
  • 153

C++ 隐式类类型转化 Implicit

一些类的构造器总是用explicit修饰,这是为什么呢?它是做什么用的呢? 我们先看看这个程序: #include #include using names...
  • skc361
  • skc361
  • 2014年05月17日 18:49
  • 634

C/C++中同名覆盖原则和赋值兼容原则

同名覆盖原则派生类与基类中有相同成员时: 若未强行指名,则通过派生类对象使用的是派生类的同名成员;如果要通过派生类的对象访问基类被覆盖的同名成员,需要加 对象名.基类名::同名成员 来限定二义性...
  • Game_Hacker
  • Game_Hacker
  • 2017年07月06日 10:07
  • 311
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++赋值兼容规则和类类型转换注意事项之一
举报原因:
原因补充:

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