高手说说:is-a has-a?还有"将派生类转换为基类是安全的"

Louistao 2011-06-08 05:20:09
高手说说:is-a has-a?还有"将派生类转换为基类是安全的",这两个问题...
...全文
115 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Louistao 2011-06-08
  • 打赏
  • 举报
回复
谢谢总结!
pathuang68 2011-06-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 louistao 的回复:]

引用 5 楼 namelij 的回复:

如果是指针的话,就不会发生截断

B *b = new D;

D *d = dynamic_cast<D *>(b);

dynamic_cast 用于将基类指针或引用安全的转换为派生类指针或引用,
是不是说直接基类到派生类转换是不安全的吧
[/Quote]

通常情况下,从派生类指针转型到积累指针(通常发生在多态性机制中,会发生截断),即向上转型,总是安全的。反之,向下转型,则未必安全(同时也说明未必不安全)。比如:

class B
{
};

class A : public B
{
};

class C : public B
{
};

int main(void)
{
B* b = new A; // upcasting, OK
A* a = (A*)b; // downcasting, OK,因为此时b所指向的对象的确就是一个A对象
C* c = (C*)b; // downcasting, NOT OK,因为此时b所指向的对象是一个A对象,而这里要转换成一个C对象
return 0;
}

pathuang68 2011-06-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 louistao 的回复:]

引用 6 楼 q191201771 的回复:

截断后安全的呀
因为已经变成一个基类对象了
只能使用基类的东西
而截断的就是基类的东西呀

明白了,大侠们,再说说has-a 和is-a在public继承中是不是都是is-a
[/Quote]
可以基本上这么看。
但是严格地说,应该不是。

因为is-a是从继承的角度来看问题的,has-a是从容器的角度来看问题的。

class B
{
};

class A : public B
{
}

// 这就是所谓的is-a关系,即A is-a B
// 尽管A中有一个完整的B子对象(subobject),但是我们还是认为A和B是is-a的关系,而非has-a的关系。



class B
{
};

class A
{
B b; // 或者 B* b; 或者B& b;
};
// 这就是典型的has-a关系,即A has-a B object


在特殊情况下,对于两个类,我们可能需要同时使用到is-a和has-a的关系。比如:
C++实现Composite模式中的第一个类图就说得很明白。
Louistao 2011-06-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 namelij 的回复:]

如果是指针的话,就不会发生截断

B *b = new D;

D *d = dynamic_cast<D *>(b);
[/Quote]
dynamic_cast 用于将基类指针或引用安全的转换为派生类指针或引用,
是不是说直接基类到派生类转换是不安全的吧
Louistao 2011-06-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 q191201771 的回复:]

截断后安全的呀
因为已经变成一个基类对象了
只能使用基类的东西
而截断的就是基类的东西呀
[/Quote]
明白了,大侠们,再说说has-a 和is-a在public继承中是不是都是is-a
就想叫yoko 2011-06-08
  • 打赏
  • 举报
回复
截断后安全的呀
因为已经变成一个基类对象了
只能使用基类的东西
而截断的就是基类的东西呀
  • 打赏
  • 举报
回复
如果是指针的话,就不会发生截断

B *b = new D;

D *d = dynamic_cast<D *>(b);
Louistao 2011-06-08
  • 打赏
  • 举报
回复
那意思是基类到派生类的转换不安全?
就想叫yoko 2011-06-08
  • 打赏
  • 举报
回复
会发生截断
Louistao 2011-06-08
  • 打赏
  • 举报
回复
那么把派生类转换到基类不会发生截断吗
無_1024 2011-06-08
  • 打赏
  • 举报
回复
主要是区别继承和复合的
派生类是基类的一个子类 在存储空间里面已经有了基类的所有数据的存储 可以转换

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧