首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++中虚继承的一个有关问题,真心不懂啊希望大侠们帮忙解答一上

2013-01-23 
C++中虚继承的一个问题,真心不懂啊,希望大侠们帮忙解答一下啊#include iostreamusing namespace stdcla

C++中虚继承的一个问题,真心不懂啊,希望大侠们帮忙解答一下啊
#include <iostream>

using namespace std;

class a
{
public:
a(){}
//~a(){}
int my;
virtual void draw()
{
cout<<"a draw"<<endl;
}
};

class test_b :public virtual a
{
public:
//test_b(){}
//~test_b(){}
public:
virtual void draw2()
{
cout<<"b draw"<<endl;
//return 0;
}
};

class test_b_: public virtual a
{
public:
test_b_(){};
//~test_b_(){};
virtual void draw()
{
cout<<" draw"<<endl;
//return 0;
}
};

class c:public test_b,public test_b_
{
public:
c(){}
~c(){}
virtual void draw()
{
cout<<"draw"<<endl;
//return 0;
}

};


int main()
{
     cout<<sizeof(a)<<endl;
     cout<<sizeof(test_b)<<endl;
     cout<<sizeof(test_b_)<<endl;
     cout<<sizeof(c)<<endl;



system("pause");

return 0;

}  
在这里如果我在test_b里面加构造和析构函数的话sizeof得到的值就是16如果不加就是12,test_b_和c这两个类也是,只要加构造和析构就比不加多四个字节,为什么?虚继承到底都改变了些什么啊?
[解决办法]
虚继承就是多了个类似虚函数表的东西
至于为什么加上构造函数和析构函数会改变对象大小 
坐等楼下。。
[解决办法]
你得有一个函数指针指向虚函数!
[解决办法]
你可以尝试输出来看看 到底里面是些什么东西
[解决办法]
楼上说的对,是多了个虚基类的指针,这更构造函数和析构函数没有关心,sizeof只是求数据成员的大小
[解决办法]

引用:
知道多了个指向虚基类的指针,但是这跟加构造函数和析构函数有什么关呢

这些C++标准里没有做规定,所以编译器可以自己决定如何分配空间,可能为了优化,编译器在某种情况下把虚类指针和虚函数指针合在了一起。
[解决办法]
你可以尝试着把内存模型输出来看看
[解决办法]
我可以向你透露一点 虚继承情况下 第一个4字节存放的东西 我现在也搞不明白,第二个四字节开始存放子类的成员变量,接下来是虚函数指针和父类成员变量
你如果给子类加上了显式构造和析构  那么会多出一个4字节 存放了个0
至于为什么 我并不知道 但我研究的结果是这样
[解决办法]
想起来听过一个视频,讲到这个多出来的4字节是什么东西, 回去找找再回复~~
[解决办法]

跟有没有构造析构函数是没有关系的,跟虚函数有关系, 涉及到一个叫作“虚函数表”的东西。

可以参考 http://blog.csdn.net/haoel/article/details/1948051/

至于虚继承

可以参考 http://blog.csdn.net/jhj735412/article/details/7580498
在文章最后有几个类似你这种情况的例子,可以仔细看看。



[解决办法]
虚继承的时候会给整个类增加一个叫做虚表的东西,用来动态的使用虚函数
可能是虚表的消耗,

[解决办法]
建议楼主根本就不要浪费生命去研究C++内部的私有实现细节。

[解决办法]
看了上面的解释我有点疑问  对象中确实是会有那么个指向虚表的指针  但它只是个指向个虚表的指针  要在上面增加什么东西的话也只可能在指向的那个虚表上面增加  为什么会影响到对象占用的内存大小呢
------解决方案--------------------


虚拟继承主要解决菱形结构,你的描述也是菱形结构,google 菱形继承
[解决办法]
sizeof 求的是类的大小 不是只求变量的吧!
  virtual 函数的:涉及一个虚函数表 有寻虚函数的指针 一个虚函数就加一个指针大小

在继承的时候 如果是虚继承一样的加4..
[解决办法]
这个和编译器实现有点关系,
有的编译器将指向虚基类的指针放在虚函数表里,那就没有多的消耗
否则就有
还有就是test_b不是因该只有8byte嘛。。test_b_也该是8byte
sizeof(int)+sizeof(void*)

热点排行