由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 问个virtual table 的问题
相关主题
问题:vptr/vtable for virtual function & vptr/vtable for怎么得到char *分配空间的大小?
一道 memset in C++的题A question about class size
C++ interdependence questionC++ template preprocessor
ask a simple question about int pointer.64BIT 软件开发
问个简单的memory allocation 的问题。g++ default optimization error
问个g++的问题Python就是爽
size of structurec++ programmer们就不用悲愤了
数组问题a simple question for C++ class
相关话题的讨论汇总
话题: virtual话题: class话题: public话题: objb话题: table
进入Programming版参与讨论
1 (共1页)
B*******g
发帖数: 1593
1
class A{
public:
virtual void f(){}
};
class B: public A
{
virtual void g() {}
};
B objB;
我的理解是以上代码只生成一个v table 里面只有一个函数 A::f()
但如果class B: virtual public A
好像就生成两个v table, 第二个v table 里面是 B::g()
virtual public A中的virtual 到底起到了什么作用?而且如果我comment out B::g()
的话
sizeof(objB) for :virtual pubic A is greater than sizeof(objB) for :pubic
A, 这多余的内存用来干嘛的?
先谢了
z***9
发帖数: 696
2
class A {
...
private:
int data;
}
class B: public A
class C: public A
class D: virtual public B, virtual public C
object of class D will only have one member "data", otherwise, without
virtual public, object of D will have two copies of member "data"
B*******g
发帖数: 1593
3
virtual不是在join时用的 应该是class B: virtual public A 和class C: virtual
public A.
我知道这个是用来解决diamond problem的。。但是如果我只有一个base一个derived
class时用
virtual和不用virtual有什么区别? 为什么sizeof(derived class)会有不同? 谢了

【在 z***9 的大作中提到】
: class A {
: ...
: private:
: int data;
: }
: class B: public A
: class C: public A
: class D: virtual public B, virtual public C
: object of class D will only have one member "data", otherwise, without
: virtual public, object of D will have two copies of member "data"

z***9
发帖数: 696
4
yep, "class B: virtual public A 和class C: virtual public A"
sorry, did not remember the exact code, but that is what I meant for virtual
inheritance.
by the way, your question may be compiler implementation dependent. I got the same size of 8 bytes for both with gcc 4.1 on RHEL x86_64. that means there is only 1 virtual pointer in objB, point to a vtbl in class B.
edit:
if I add "int data" to each class, I can see a difference in size (16 vs 32) for using virtual public or not using it. guess a
z****e
发帖数: 2024
5
应该是compiler implement dependent 的。标准里边没有如何implement virtual
mechanism吧。
d****p
发帖数: 685
6

针对你的单继承例子.
如果基类本身有虚函数,两者无区别.否则,虚拟继承会在继承类中插入虚函数表,就是你
观察的类变大了.
为什么sizeof(derived class)会有不同? 谢了

【在 B*******g 的大作中提到】
: virtual不是在join时用的 应该是class B: virtual public A 和class C: virtual
: public A.
: 我知道这个是用来解决diamond problem的。。但是如果我只有一个base一个derived
: class时用
: virtual和不用virtual有什么区别? 为什么sizeof(derived class)会有不同? 谢了

z****e
发帖数: 2024
7
你这个说错了吧?
虚函数表是不会改变对象size的,是虚指针。
虚函数表是一个静态的array,对象里边看不到的吧。
啊?

【在 d****p 的大作中提到】
:
: 针对你的单继承例子.
: 如果基类本身有虚函数,两者无区别.否则,虚拟继承会在继承类中插入虚函数表,就是你
: 观察的类变大了.
: 为什么sizeof(derived class)会有不同? 谢了

B*******g
发帖数: 1593
8
我测试的时候base class 是一直有虚函数的, 我唯一改变的就是 : public base ->
virtual public base.两种情况都有v table 里面内容也一样。。
我用的VS express 2010,也许像楼上说的和compiler有关吧 搞不明 我决定move on 了
呵呵
d****p
发帖数: 685
9
It is always good to be accurate.
It is a pointer to v-table so you are right.

【在 z****e 的大作中提到】
: 你这个说错了吧?
: 虚函数表是不会改变对象size的,是虚指针。
: 虚函数表是一个静态的array,对象里边看不到的吧。
: 啊?

d****p
发帖数: 685
10
I guess it is compiler dependent. My conclusion was drawn for gcc/os x.
I didn't remember how standard specifies this but my guess is there should
be no difference in term of behaviour if it is case A->virtual public->B or
A->public->B.
It's up to compiler to decide how to setup up info in B that virtually
inherit A to solve diamond issue if its descendant class C inherits another
A's virtual inherited descendant class.
The book Inside C++ Obj Model talks a lot about this.

>

【在 B*******g 的大作中提到】
: 我测试的时候base class 是一直有虚函数的, 我唯一改变的就是 : public base ->
: virtual public base.两种情况都有v table 里面内容也一样。。
: 我用的VS express 2010,也许像楼上说的和compiler有关吧 搞不明 我决定move on 了
: 呵呵

1 (共1页)
进入Programming版参与讨论
相关主题
a simple question for C++ class问个简单的memory allocation 的问题。
difference between: char** p and char*p[] ??问个g++的问题
关于C++中一个Class的大小 (转载)size of structure
数组定义的时候,分配空间了么?数组问题
问题:vptr/vtable for virtual function & vptr/vtable for怎么得到char *分配空间的大小?
一道 memset in C++的题A question about class size
C++ interdependence questionC++ template preprocessor
ask a simple question about int pointer.64BIT 软件开发
相关话题的讨论汇总
话题: virtual话题: class话题: public话题: objb话题: table