有关多重继承参数传递问题? 请帮忙调试一下这个程序,谢谢啦!!!!!!!!

farawayspring 2009-05-23 10:31:21
#ifndef _SEVEN3_
#define _SEVEN3_
#include<iostream>
using namespace std;

//Cvehicle类的定义
class Cvehicle
{
public:
Cvehicle(int MaxSpeed,int Weight);
Cvehicle(){};
void Run();
void Stop();
int GetMaxSpeed();
int GetWeight();
void SetWeight(int w);
void SetMaxSpeed(int max);
void Display();
//int GetMaxSpeed();

private:
int m_MaxSpeed;
int m_Weight;
};

//Cbicycle类的定义
class Cbicycle:virtual public Cvehicle
{
private:
int m_VehicleNum;
float m_Height;
public:
Cbicycle(int MaxSpeed,int Weight,float Height);
void SetHeight(float n);
float GetHeight();
void Display();

};

//Cmotorcar类的定义
class Cmotorcar:virtual public Cvehicle
{
private:
int m_SeatNum;
public:
Cmotorcar(int MaxSpeed,int Weight,int seatnum);
void SetSeatNum(int n);
int GetSeatNum();
void Display();
};

//Cmotorcycle类的定义
class Cmotorcycle:public Cbicycle,public Cmotorcar
{
public:
void Display();
Cmotorcycle(int MaxSpeed,int Weight,float Height,int seatnum);
int n;
};

#endif

Cvehicle::Cvehicle(int MaxSpeed, int Weight)
{
cout<<"构造了一个车"<<endl;
m_MaxSpeed=MaxSpeed;
m_Weight=Weight;
}
void Cvehicle::Run()
{
cout<<"车启动啦!"<<endl;

}

void Cvehicle::Stop()
{
cout<<"车停止了!"<<endl;

}


void Cvehicle::SetWeight(int w)
{
m_Weight=w;
}

void Cvehicle::SetMaxSpeed(int max)
{
m_MaxSpeed=max;
}
int Cvehicle::GetWeight()
{
return m_Weight;
}

int Cvehicle::GetMaxSpeed()
{
return m_MaxSpeed;
}

void Cvehicle::Display()
{
cout<<"车的基本信息如下:"<<endl;
cout<<"最大速度 重量 "<<endl;
cout<<m_MaxSpeed<<" "<<m_Weight<<endl;

}

//bicycle 类的实现

Cbicycle::Cbicycle(int MaxSpeed, int Weight, float Height):Cvehicle(MaxSpeed,Weight)
{
cout<<"将车改装成了一辆自行车!"<<endl;
m_Height=Height;
}

float Cbicycle::GetHeight()
{
return m_Height;
}

void Cbicycle::SetHeight(float n)
{
m_Height=n;
}

void Cbicycle::Display()
{
cout<<"自行车的基本信息如下:"<<endl;
cout<<"最大速度 重量 高度"<<endl;
cout<<GetMaxSpeed()<<" "<<GetWeight()<<" "<<m_Height<<endl;

}

//Cmotorcar类的实现
Cmotorcar::Cmotorcar(int MaxSpeed, int Weight,int seatnum):Cvehicle(MaxSpeed,Weight)
{
m_SeatNum=seatnum;
cout<<"构造了一辆汽车"<<endl;
}

int Cmotorcar::GetSeatNum()
{
return m_SeatNum;
}

void Cmotorcar::SetSeatNum(int n)
{
m_SeatNum=n;
}


void Cmotorcar::Display()
{
cout<<"此汽车的基本信息如下:"<<endl;
cout<<"最大速度 重量 座位数 "<<endl;
cout<<GetMaxSpeed()<<" "<<GetWeight()<<" "<<GetSeatNum()<<endl;
}
//Cmotorcycle类的实现

Cmotorcycle::Cmotorcycle(int MaxSpeed,int Weight,float Height,int seatnum):Cmotorcar(MaxSpeed,Weight,seatnum),Cbicycle(MaxSpeed,Weight, Height) {
cout<<"派生了一辆摩托车"<<endl;

}
void Cmotorcycle::Display()
{
cout<<"此摩托车的基本信息如下:"<<endl;
cout<<"最大速度 重量 高度 座位数 "<<endl;
cout<<GetMaxSpeed()<<" "<<GetWeight()<<" "<<GetHeight()<<" "<<GetSeatNum()<<endl;
}

void main()
{
//Cvehicle vehicle(160,2);
//vehicle.display();
//Cbicycle bicycle(60,25,1.5);
//bicycle.Display();
//Cmotorcar motorcar(200,100,4);
//motorcar.Display();
Cmotorcycle motorcycle(100,50,1.5,1);//参数一次表示:最大速度 重量 高度 座位数
motorcycle.Display();
}

其中Cmotorcar和Cbicycle继承Cvehicle类
Cmotorcycle继承Cmotorcar和Cbicycle类
程序能运行,可是结果不正确
得不到正确:最大速度和重量
所有派生类的最大速度和重量的设置均由Cvehicle类中的Cvehicle(int MaxSpeed,int Weight)设置,
可是程序在执行时调用的是Cvehicle(){};

请帮帮解决一下。。谢谢!!!!!!!!!
...全文
75 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
red_berries 2009-05-24
  • 打赏
  • 举报
回复
5楼说的比较详细了,一个实例两个派生实例都去初始化是肯定不行的,虚拟基类的初始化由最终派生类来负责
wbgxx 2009-05-24
  • 打赏
  • 举报
回复
好长 啊 !!!!!!!!
MichaelBomb 2009-05-24
  • 打赏
  • 举报
回复
顶了,留作纪念
sidaeren 2009-05-24
  • 打赏
  • 举报
回复
在多重继承中,再加上虚继承,对于虚基类来说(你的程序中的Cvehicle类),它的构造是由最终派生类来负责的,与一般继承体系不同,在你的程序中,最终派生类为Cmotorcycle类,虽然Cmotorcycle类有构造函数:Cmotorcycle::Cmotorcycle(int MaxSpeed,int Weight,float Height,int seatnum):Cmotorcar(MaxSpeed,Weight,seatnum),Cbicycle(MaxSpeed,Weight, Height) ,你一定是认为在这个构造函数中,调用了Cmotorcar类和Cbicycle类的构造函数:

Cmotorcar::Cmotorcar(int MaxSpeed, int Weight,int seatnum):Cvehicle(MaxSpeed,Weight) ;

Cbicycle::Cbicycle(int MaxSpeed, int Weight, float Height):Cvehicle(MaxSpeed,Weight) ;
而Cmotorcar类和Cbicycle类又调用了Cvehicle::Cvehicle(MaxSpeed,Weight);这在非虚继承中是有效的,但是Cvehicle类是虚基类,它的构造不受继承链中间层的类负责,它的构造直接由最终派生类,也就是Cmotorcycle类负责,所以你的最终类Cmotorcycle的构造函数应改为:Cmotorcycle::Cmotorcycle(int MaxSpeed,int Weight,float Height,int seatnum):Cvehicle(MaxSpeed,Weight),Cmotorcar(MaxSpeed,Weight,seatnum),Cbicycle(MaxSpeed,Weight, Height)。在你写错的那个构造函数中,之所以会调用Cvehicle(){},是因为在Cmotorcycle类构造对象时,首先调用虚基类的构造函数,由于你没有明确写出调用虚基类的构造函数,因此它会隐式调用虚基类Cvehicle的缺省构造,然后再依次调用那两个直接基类的构造函数,而这两个处于中间层的类的构造函数中调用的虚基类Cvehicle的构造函数就会被自动取消,也就是它们不会再调用Cvehicle::CVehicle(MaxSpeed,Weight)类,其实这也就是“虚基类”的“虚”的真正含义,如果C++不是这样设计的话,那么你那两个中间类都调用了Cvehicle::CVehicle(MaxSpeed,Weight),就会产生二义性,到底谁才是负责构造Cvehicle类对象的呢?

总而言之,一句话,虚基类是由最终派生类负责构造,中间层的类全靠边站,不然大家就会乱套。而且在生成对象时,虚基类的构造函数也是最先被直接调用,不像一般的继承链。

《C++ Primer》第三版和《C++编程思想第二版》均有详述,《C++设计与演化》和《C++对象模型》说的就更透彻了。你可以参考参考。里面对于虚函数指针和虚表指针讲得很好啊。呵呵
ltc_mouse 2009-05-23
  • 打赏
  • 举报
回复
多重继承很麻烦...


//这么修改可以正常,但为什么,在下无能为力了...
Cmotorcycle::Cmotorcycle(int MaxSpeed,int Weight,float Height,int seatnum):Cmotorcar(MaxSpeed,Weight,seatnum),Cbicycle(MaxSpeed,Weight, Height)
==>
Cmotorcycle::Cmotorcycle(int MaxSpeed,int Weight,float Height,int seatnum):Cvehicle(MaxSpeed,Weight),Cmotorcar(MaxSpeed,Weight,seatnum),Cbicycle(MaxSpeed,Weight, Height)
farawayspring 2009-05-23
  • 打赏
  • 举报
回复
自己顶一下!
farawayspring 2009-05-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liliangbao 的回复:]
帮顶~
[/Quote]

谢谢!
liliangbao 2009-05-23
  • 打赏
  • 举报
回复
帮顶~

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧