class CAR
{
protected:
double speed;
public:
CAR()
{
}
CAR(double s)
{
speed = s;
cout<<"创建汽车("<<s<<"/小时)"<<endl;
}
~CAR()
{
cout<<"销毁汽车("<<speed<<"公里/小时)"<<endl;
}
void Show()
{
cout<<"汽车: "<<speed<<"公里/小时"<<endl;
}
};
class BUS : virtual public CAR
{
public:
BUS(double s, double t) : CAR( s)
{
cout<<"创建客车("<<t<<"人)"<<endl;
seat = t;
}
~BUS()
{
cout<<"销毁客车("<<seat<<"人)"<<endl;
}
void Show();
protected:
double seat;
};
void BUS :: Show()
{
cout<<"客车: "<<speed<<"公里/小时, "<<seat<<"人"<<endl;
}
class TRUCK : virtual public CAR
{
public:
TRUCK(double s, double w) : CAR( s)
{
cout<<"创建货车("<<w<<"吨)"<<endl;
}
~TRUCK()
{
cout<<"销毁货车("<<load<<"吨)"<<endl;
}
void Show();
protected:
double load;
};
void TRUCK :: Show()
{
cout<<"货车: "<<speed<<"公里/小时, "<<load<<"吨"<<endl;
}
class VAN :virtual public BUS, virtual public TRUCK
{
public:
VAN(double s, double t, double w) : TRUCK( s, w) , BUS( s, t)
{
cout<<"创建客货两用车"<<endl;
}
~VAN()
{
cout<<"销毁客货两用车"<<endl;
}
void Show();
};
void VAN :: Show()
{
cout<<"客货两用车: "<<CAR :: speed<<"公里/小时, "<<BUS :: seat<<"人, "<<TRUCK ::load<<"吨"<<endl;
}
1.一旦类中有函数被定义为了虚函数,类就会拥有一个虚函数表。
虚函数表中,保存着一系列函数指针,指向这个类中的虚函数实际的起始地址。
为了能获取到类的虚函数表,类的每个对象中就需要保存一个指针,指向自己的类的虚函数表(vtbl,也称虚表)。这个指针称为虚函数表指针(vptr)。当使用基类指针指向子类对象并调用虚函数时,程序会通过对象的虚表指针去子类虚表中查找虚函数的实际地址。也是因为这个原因,定义了虚函数的类的对象中会多一个4/8字节(取决于32位/64位)的指针,存于变量的起始位置。2.虚继承中,子类并不像普通继承那样拥有一份基类的内存结构,而是加了一个虚基类表指针指向虚基类。
当虚基类的子类被继承时,虚基类表指针也会被继承。
因此,当某个子类通过不同路径继承了同一个虚基类时,该子类的内存中只会存在一份虚基类的拷贝,避免了冲突。
https://www.cnblogs.com/zoey-liao/archive/2020/11/15/13983039.html
3.之前在想虚函数与虚基类继承冲突吗,不冲突;
4.虚基类继承的析构函数:
虚基类继承中的析构函数问题_Luckyh6的博客-CSDN博客_虚基类析构函数(作者大大好厉害,我好懒qwq)
#include <iostream>
using namespace std;
/* 你提交的代码将被嵌在这里 */
class CAR
{
protected:
double speed;
public:
CAR()
{
}
CAR(double s)
{
speed = s;
//cout<<"miao"<<speed<<endl;
cout<<"创建汽车("<<speed<<"/小时)"<<endl;
}
virtual ~CAR()
{
cout<<"销毁汽车("<<speed<<"公里/小时)"<<endl;
}
virtual void Show()
{
cout<<"汽车: "<<speed<<"公里/小时"<<endl;
}
};
class BUS : virtual public CAR
{
public:
BUS(double s, double t) : CAR( s)
{
seat = t;
//cout<<"miao"<<seat<<" "<<t<<endl;///
cout<<"创建客车("<<seat<<"人)"<<endl;
}
virtual ~BUS()
{
cout<<"销毁客车("<<seat<<"人)"<<endl;
}
virtual void Show();
protected:
double seat;
};
void BUS :: Show()
{
cout<<"客车: "<<speed<<"公里/小时, "<<seat<<"人"<<endl;
}
class TRUCK : virtual public CAR
{
public:
TRUCK(double s, double w) : CAR( s)
{
cout<<"创建货车("<<w<<"吨)"<<endl;
}
virtual ~TRUCK()
{
cout<<"销毁货车("<<load<<"吨)"<<endl;
}
virtual void Show();
protected:
double load;
};
void TRUCK :: Show()
{
cout<<"货车: "<<speed<<"公里/小时, "<<load<<"吨"<<endl;
}
class VAN :public BUS, public TRUCK
{
public:
VAN(double s, double t, double w) : TRUCK( s, w) , BUS( s, t),CAR(s)
{
cout<<"创建客货两用车"<<endl;
}
virtual ~VAN()
{
cout<<"销毁客货两用车"<<endl;
}
void Show();
};
void VAN :: Show()
{
//cout<<"gulugulu"<<endl;
cout<<"客货两用车: "<<speed<<"公里/小时, "<<seat<<"人, "<<load<<"吨"<<endl;
}
int main()
{
CAR *p;
double s, t, w;
cin>>s>>t>>w;
p = new VAN(s, t, w);
p->Show();
delete p;
return 0;
}