1. 基类对象指针/引用 = 派生类对象指针/引用;
可以将派生类对象指针/引用赋值给基类对象指针/引用。C++要求指针/引用类型
与赋给的类型相匹配,这一规则对继承来说是例外,但这种例外是单向的。并
且不需要强制转换就可以进行,这种向上的转换是安全的。
2. 派生类对象指针/引用 = 基类对象指针/引用;
这种转换不属于上一条中的例外,并且只有通过强制转换才能进行。而且使用这
种指针/引用不是安全的。
3. 基类对象 = 派生类对象;
派生类对象可以赋值给基类对象,但其中新增的成员将被忽略。赋值时使用基类
的赋值操作符。
4. 派生类对象 = 基类对象;
只有在派生类定义了适当的转换操作符,赋值操作符时这种赋值才是可能的。
1. 用Is-a定义即可证明其逻辑合理性
2. 会引起访问越界出错
3. “裁剪”
4. bitwise拷贝并不适用,因为会破坏派生类对象的vbtr
1、不是例外,C++里派生类就是基类,所以类型是匹配的。安全。
2、dynamic_cast就是为了解决这个问题引入的安全转换。
3、对。此外vtable将被修改。
4、基本上是设计失败的表现。
在可以用static_cast安全地进行转换时比用dynamic_cast转换更优秀,这说明设计的比较好。用dynamic_cast进行转换通常说明可能会转换失败,或是存在“菱形继承”或“虚继承”。
当对象存在vtpr时,隐含生成的拷贝成员也不会是简单的bit-move操作。
在没有定义从基类到衍生类的转换时事实上是不会调用拷贝成员的。
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'
*/
就是说向上强制类型转换OK,而相反却不行,因为派生类中可能有新增的数据或函数成员
阅读(1716) | 评论(0) | 转发(0) |