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 了 : 呵呵
|