【讨论】基类对象,派生类对象,及其指针/引用间的赋值。
1. 基类对象指针/引用 = 派生类对象指针/引用;
可以将派生类对象指针/引用赋值给基类对象指针/引用。C++要求指针/引用类型
与赋给的类型相匹配,这一规则对继承来说是例外,但这种例外是单向的。并
且不需要强制转换就可以进行,这种向上的转换是安全的。
2. 派生类对象指针/引用 = 基类对象指针/引用;
这种转换不属于上一条中的例外,并且只有通过强制转换才能进行。而且使用这
种指针/引用不是安全的。
3. 基类对象 = 派生类对象;
派生类对象可以赋值给基类对象,但其中新增的成员将被忽略。赋值时使用基类
的赋值操作符。
4. 派生类对象 = 基类对象;
只有在派生类定义了适当的转换操作符,赋值操作符时这种赋值才是可能的。
// 欢迎讨论,共同进步。
// 真诚欢迎批评,指正,补充。
问题点数:100、回复次数:15Top
1 楼fireseed(【VC无敌,英明神武,千秋万代,一统江湖!】—奶油狗)回复于 2003-12-02 10:57:57 得分 34
1. 用Is-a定义即可证明其逻辑合理性
2. 会引起访问越界出错
3. “裁剪”
4. bitwise拷贝并不适用,因为会破坏派生类对象的vbtrTop
2 楼fierygnu(va_list)回复于 2003-12-02 10:59:32 得分 33
1、不是例外,C++里派生类就是基类,所以类型是匹配的。安全。
2、dynamic_cast就是为了解决这个问题引入的安全转换。
3、对。此外vtable将被修改。
4、基本上是设计失败的表现。
Top
3 楼LoveCreatesBeauty(lovecreatesbeauty.googlepages.com)回复于 2003-12-02 11:20:03 得分 0
多谢 fireseed, fierygnu 两位的指正。Top
4 楼plainsong(短歌)()回复于 2003-12-03 00:21:07 得分 33
在可以用static_cast安全地进行转换时比用dynamic_cast转换更优秀,这说明设计的比较好。用dynamic_cast进行转换通常说明可能会转换失败,或是存在“菱形继承”或“虚继承”。
当对象存在vtpr时,隐含生成的拷贝成员也不会是简单的bit-move操作。
在没有定义从基类到衍生类的转换时事实上是不会调用拷贝成员的。
Top
5 楼renfengxing(任风行)回复于 2003-12-03 09:43:12 得分 0
请问楼上的大哥,这种知识是怎么学来的啊?
我非常~~非常~想知道~~~
能不能给我介绍本相关的书??谢谢~Top
6 楼LoveCreatesBeauty(lovecreatesbeauty.googlepages.com)回复于 2003-12-03 09:46:23 得分 0
夜里这么晚了 ,多谢 plainsong 。艳羡您的学识:)Top
7 楼byyyyy(苦行僧【苦】)回复于 2003-12-03 11:36:37 得分 0
太深奥了。学习中。。。。Top
8 楼LoveCreatesBeauty(lovecreatesbeauty.googlepages.com)回复于 2003-12-03 14:11:26 得分 0
http://expert.csdn.net/Expert/topic/2443/2443196.xml?temp=.5420038
《冬夜》...辛笛...——1934年12月 西山松堂一夜
http://poem365.myetang.com/xd/xd3.htm
终可求证,难为了我对于美好的事物的好记性。犹今日之诗,不意时空相隔如斯。
//今日开始我要为新工作奔忙了,记之。Top
9 楼LoveCreatesBeauty(lovecreatesbeauty.googlepages.com)回复于 2003-12-03 14:15:09 得分 0
http://poem365.myetang.com/mpoem/peom_m.htmTop
10 楼LoveCreatesBeauty(lovecreatesbeauty.googlepages.com)回复于 2003-12-04 10:24:18 得分 0
class Base{
};
class Derived : //public
Base{
};
int main()
{
Derived objD;
Base & pB = objD;
}
/*
在private继承中,派生类的指针/引用不能赋值给基类的指针/引用。
Dev-C++ v498
11 D:\Working\c++\Untitled1.cpp
`Base' is an inaccessible base of `Derived'
*/Top
11 楼transformers()回复于 2003-12-05 13:59:45 得分 0
太需要学习了!Top
12 楼LoveCreatesBeauty(lovecreatesbeauty.googlepages.com)回复于 2003-12-14 20:49:40 得分 0
upTop
13 楼jzflyaway(flyaway)回复于 2003-12-14 21:15:39 得分 0
我前几天做关于这的题目时,总是搞不懂,
现在看了楼主的贴子,真的是省了我很多时间,
不过楼主,能不能举个简单的例子证实一下.
谢谢!Top
14 楼langzi8818(┤天道酬勤┝爱老婆┦┷我是来学习滴┷)回复于 2003-12-14 22:02:58 得分 0
1,3我知道!
2,4就是不太懂了,因为我从来没有这么做过!这样做我想危险很大的
4,我想肯定会破坏vtableTop
15 楼bestsmoke((嘿嘿))回复于 2003-12-15 10:50:14 得分 0
就是说向上强制类型转换OK,而相反却不行,因为派生类中可能有新增的数据或函数成员Top




