C++不是说虚基类构造函数只被调用一次吗?
#include<iostream>usingnamespacestd;classbus{protected:intweight;public:voidshow(){co...
#include <iostream>
using namespace std;
class bus
{
protected:
int weight;
public:
void show()
{
cout<<"bus weigth is:"<<weight<<endl;
}
void set(int weight)
{
this->weight=weight;
}
bus()
{
weight=0;
cout<<"虚基类bus只被初始化一次"<<weight<<endl;
}
};
class minibus:virtual public bus
{
public:
void show()
{
cout<<"minibus weigth is:"<<weight<<endl;
}
};
class maxbus:virtual public bus
{
public:
void show()
{
cout<<"maxbus weigth is:"<<weight<<endl;
}
};
void main()
{
bus a;
minibus b;
maxbus c;
a.show();
b.show();
c.show();
a.set(50);
a.show();
b.show();
c.show();
}
这个程序输出可以看到是虚基类的构造函数被调用了3次,这是什么原因?是因为我在最远派生类中没有使用构造函数造成的吗?但书上说程序会自动调用自定义的默认构造函数来初始化的哦,这是为什么?请高手指教下~ 展开
using namespace std;
class bus
{
protected:
int weight;
public:
void show()
{
cout<<"bus weigth is:"<<weight<<endl;
}
void set(int weight)
{
this->weight=weight;
}
bus()
{
weight=0;
cout<<"虚基类bus只被初始化一次"<<weight<<endl;
}
};
class minibus:virtual public bus
{
public:
void show()
{
cout<<"minibus weigth is:"<<weight<<endl;
}
};
class maxbus:virtual public bus
{
public:
void show()
{
cout<<"maxbus weigth is:"<<weight<<endl;
}
};
void main()
{
bus a;
minibus b;
maxbus c;
a.show();
b.show();
c.show();
a.set(50);
a.show();
b.show();
c.show();
}
这个程序输出可以看到是虚基类的构造函数被调用了3次,这是什么原因?是因为我在最远派生类中没有使用构造函数造成的吗?但书上说程序会自动调用自定义的默认构造函数来初始化的哦,这是为什么?请高手指教下~ 展开
2个回答
展开全部
不知道是书没说明白还是你没看明白, 总之你完全理解错了。
所谓只调用一次, 是说每个对象的构造当中只调用一次。 如果多个对象当然调用多次
对比一下虚继承和非虚继承的差别:
如果B (非虚,后面就不写了)继承A, C也继承A,D继承B和C,最终D里有两份A的内容,D的对象构造的时候A的构造函数也会被调用两次。
如果 B 虚继承A , C也虚继承A, D继承B和C, 最终D的对象里只有一份从A继承下来的东西,D的对象构造的时候A的构造函数也只调用一次
所谓只调用一次, 是说每个对象的构造当中只调用一次。 如果多个对象当然调用多次
对比一下虚继承和非虚继承的差别:
如果B (非虚,后面就不写了)继承A, C也继承A,D继承B和C,最终D里有两份A的内容,D的对象构造的时候A的构造函数也会被调用两次。
如果 B 虚继承A , C也虚继承A, D继承B和C, 最终D的对象里只有一份从A继承下来的东西,D的对象构造的时候A的构造函数也只调用一次
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询