C++ 派生类有可能比基类小吗?

wfh_178 2008-04-18 04:56:58

class A{
...
};
class B:... A{
...
};

sizeof B < sizeof A 这可能吗?
...全文
1818 204 打赏 收藏 转发到动态 举报
写回复
204 条回复
切换为时间正序
请发表友善的回复…
发表回复
pklimi 2011-11-17
  • 打赏
  • 举报
回复
Oh, my LadyGaGa!
futurepi 2010-12-29
  • 打赏
  • 举报
回复
这问题有什么意义吗
sjjf 2008-05-11
  • 打赏
  • 举报
回复
这么快就揭帖了,taodm还没有解释为什么

struct X
{
char i[2];
};
sizeof(X)可以为1,只要程序任何地方都没有使用到i[1]成员

tinaxue 2008-05-06
  • 打赏
  • 举报
回复
针对199楼的:

class B
{
protected:
int n;
};
class D:private B
{
void Test()
{
D d;
d.n = 0;//! VS2005 可行的
}
};
当然 可以看到
class B
{
private:
int n;
};
class D:private B
{
void Test()
{
D d;
d.n = 0;//! VS2005 不可行的
}
};
chuengchuenghq 2008-05-05
  • 打赏
  • 举报
回复
200楼 ~
SSSummering114 2008-05-05
  • 打赏
  • 举报
回复
似乎不大可能
iambic 2008-05-05
  • 打赏
  • 举报
回复
200!
jintian01 2008-05-05
  • 打赏
  • 举报
回复
感觉有可能会出现,内存占用有两种情况:1:数据成员,2:虚函数地址。
如果继承是私有继承的话,那么保护成员,和私有成员在派生类里面应该是不占用内存空间的
kaizitop 2008-05-05
  • 打赏
  • 举报
回复
不错,都是技术狂人哦!
cryingzgz 2008-05-05
  • 打赏
  • 举报
回复
加油顶到200楼~~
sjjf 2008-05-04
  • 打赏
  • 举报
回复
卫亭的推论再推论一下。
struct X
{
char i[2];
};
sizeof(X)可以为1,只要程序任何地方都没有使用到i[1]成员
----------------------------
taodm,来,解释一下,这个我不甚明白。
sjjf 2008-05-04
  • 打赏
  • 举报
回复
[Quote=引用 182 楼 taodm 的回复:]
注释70) The actual size of a base class subobject may be less than the result of applying sizeof to the subobject, due to virtual base
classes and less strict padding requirements on base class subobjects.

所以,你的结论可能是正确的。但是你探索的方向上很可能是无法成为实际的空想。
也许按照这个注释的提示可以实现出某个实用系统。
也只有能实现了实用系统,结论才算被证明吧。

[/Quote]

不严密的标准未必就是正确的,
推论如下:子类拥有比父类拥有更多的信息,为了方便,就不讨论函数了,也不讨论空继承了,等号可以忽略不计,
如果以属性作为描述信息的存储空间来算的话,
那么不管怎么样子类都会比父类拥有更多的size,
拥有更多的描述信息,却用更少的信息存储空间,
这在没有压缩的情况下是这是不可能的。

有一种情况可能会导致子类的信息存储的尺寸比父类小,那种情况是size指的是增量的size.
最顶层的类是自己的绝对size(和0比较的增量)
其他的子类都是相对的。
但这种情况下实际上改变了sizeof的含义了。
到时候取父类和子类的大小,就不是sizeof了。
无论如何,都不会改变子类size比父类大。
死扣标准,没啥意思。
lidongri 2008-05-04
  • 打赏
  • 举报
回复
再顶。。。。
baihacker 2008-05-04
  • 打赏
  • 举报
回复
顶起来看看
zgjxwl 2008-05-02
  • 打赏
  • 举报
回复
up
清钟沁桐 2008-05-02
  • 打赏
  • 举报
回复
怎么测试的 ?
lightlife 2008-04-30
  • 打赏
  • 举报
回复
C++标准里没有说downcast是要保证安全的吗?
taodm 2008-04-30
  • 打赏
  • 举报
回复
[Quote=引用 176 楼 Vitin 的回复:]
引用 171 楼 taodm 的回复:
这个代码只是不好的编程习惯,而不是不合法。

是的,它合法,但是运行时可能不正确,是吧。所以即使运用我的方案时,它运行不正确,也不是方案的错吧?
[/Quote]
它的运行后果是可预知的,你所能做的只是在你的方案里再加一条“不支持”。
Vitin 2008-04-30
  • 打赏
  • 举报
回复
[Quote=引用 186 楼 taodm 的回复:]
你为什么不再花点时间让它更实际一点呢?尽量去掉一些约束呢?
[/Quote]
不错,目前它的约束就已经很多了。要去掉一些约束是有难度的。也许这是一个提示,启发我们去思考:为什么会有那么多约束。然后,我们就会更深入地了解事物的本质,从而更好的方案做好准备。我相信,这个目的一定程度上已经达到了。

当然,任何进步都是复杂的。我们可以花几天时间讨论一个简单地方案。但是距离真正实现的代码(甚至真正具有工业强度的方案)还有很远的距离。所以,这仅仅是个开始。作为接下来的第一步——使它更简单、约束更小的工作就不是几天功夫可以完成的。我想,有兴趣的人可以继续研究下去,总有一天它会体现其实用价值的。
Vitin 2008-04-30
  • 打赏
  • 举报
回复
184楼所说的,可能就是 layout different from 的初始原因。不过标准没有说只有在含虚基类时可以不同,可见标准放宽了条件,为除此之外的更多变化(比如说,我的方案,呵呵)留下了空间。

我的方案可以看作,为了利用这个空间而做的小小探索。或许象这样的小小探索永远不会单独实现。但是,至少这样的工作是有益的。结论的“是”或“否”并不重要。重要的是这个过程(我相信,我们都从中获益),以及获得了结论(哪怕是初步的、或不完整的)。当人们寻求一个巨大的技术进步时,无数个这样的小小探索是这种进步的动力之源。

加载更多回复(183)
相关推荐

63,593

社区成员

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