C++虚基类问题

题目:定义一个车(vehicle)基类,具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。从bicycle和motorcar派生出摩托车(motorcycle)类,在继承过程中,注意把vehicle设置为虚基类。
若是把vehicle设置为虚基类,岂不是到后来派生出的汽车、自行车等类的
MaxSpeed、Weight、Run、Stop这些属性都一样了么。还是我理解有问题。请大虾帮忙。

你所说的车这个“虚基类”并不是一个实现类,也不是类的实例。
其实你可以这么理解:
汽车、自行车、摩托车这几个类之间并没有什么联系,是完全不同的类。只不过有相同的属性而已,例如:汽车有汽车的重量和自行车有自行车的重量,而车是凌驾于“各种车们”之上的概念,它其实是与汽车、自行车、摩托车类一样,都是类。他们唯一的关系是:定义汽车的重量时用到了车的重量这个概念,都继承于车,证明他们都有车的共同属性,但各自的重量可以不同,汽车是1T而自行车是2kg。
总体来说就是,这些汽车、自行车、**车...他们都有这些属性,但属性值可以不同!
上升点高度:子类继承于父类后,会继承父类的属性,而不会继承父类的属性值,同样,各子类间的属性值没有任何关系。

不知道讲明白没~~
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-07-14
虚基类用于只提供声明接口,由派生类去定义接口。
一般是这样使用 vehicle* pv = derivedvehicle; //后面那个类是vehicle的派生类 基类对象必须是指针* pv ,不可以是实例化的具体类

class vehicle
{
public:
virtual ~vehicle() = 0; //必须定义vehicle的析构函数否则编译出错,这是规定
virtual void MaxSpeed() = 0; //可以定义也可以不用定义
virtual void Weight() = 0; //可以定义也可以不定义
virtual void Run() = 0; //可以定义也可以不定义
virtual void Stop() = 0; //可以定义也可以不定义
};
class bicycle : public vehicle
{
public:
virtual void Run() ; //这里bicycle 修改了Run的接口
//当vehicle* pv = bicycleObject时候,发运行时动态绑定,
//也就是说pv指针指向这个派生类对象的时候,你pv->Run()
//调用的就是bicycle 类的Run函数,而不再是基类的Run()函数。
};
class motorcar : public vehicle
{
public:
virtual void Stop();
virtual void Run(); //如果基类指针指向motorcar ,那么它调用就就是motorcar::Run()
};
也就是说
基类指针指向什么派生类就调用哪个派生类函数。可是如果派生类没有去修改继承的函数,调用的就是基类的函数.。
对了一定要记得,调用未定义的函数是非法的。所以你如果你确定要继承就要修改接口函数,如果你确定有些接口函数不用修改,就要去定义,一定要定义。还有基类虚函数一定要定义。本回答被网友采纳

什么是虚基类(在c++中)?
虚基类在C++中的定义 虚基类是一种特殊的类,它在被其他类继承时,允许其它派生类之间形成共同基类的层级结构。虚基类的主要目的是解决多重继承的问题,它可以确保一个基类只在一个派生类中实例化一次,从而避免数据冗余和冲突。在C++中,通过关键字virtual来声明虚基类。当一个类被声明为虚基类时,表明...

什么是虚基类(在C++中)?
在C++中,虚基类是一种特殊类型的基类,其主要作用在于处理多重继承时可能出现的复杂性。当派生类(Derive)通过virtual关键字从一个基类(Base)进行继承时,该基类就会变为虚基类。例如:class derive : virtual public base{}; 使用虚基类的主要目的是避免在多重继承中,同一基类被重复继承导致的混乱。如...

C++中提供虚基类是因为:
选择A。是因为C++支持多重继承,可能导致名字冲突。因为基类A可以被多个派生类B1、B2、B3……继承,如果这些派生类再被新的派生类C共同继承,那么在C里就可能存在多个基类A。所以才有虚基类,使得派生类C中只能存在一个基类A。

C++中设置虚基类的目的是: A:简化程序 B:消除二义性 C:提高运行效率 D...
A:简化程序 和纯虚函数没关系 B:消除二义性 正解, 虚基类是为了强调"这个类型的某些方法没有意义, 只是为了继承, 不要构造这种类型的对象"C:提高运行效率 和纯虚函数没关系 D:减少目标代码 纯虚函数和空函数相比相差也就是几个字节, 如果这也算的话确实是减少了 ...

什么是虚基类(在C++中)?
虚基类主要解决在多重继承时,基类可能被多次继承,虚基类主要提供一个基类给派生类,如:class B { };class D1 : public B { };class D2 : public B { };class C: public D1, public D2 { };这里C在D1,D2上继承,但有两个基类,造成混乱。因而使用虚基类,即:class B { };clas...

如何对C++虚基类构造函数
如何对C++虚基类构造函数 你应该知道虚基类是为了防止多继承产生问题,比如一个基类可能会被同一个子类继承好几次,有了虚基类,那么这个基类就不会在对象内存布局上重复出现了。然后再看这句话,结合前面的描述,我们可以这样理解。 class A 基类A class B:public A B继承A class C:public A...

关于C++中用虚基类解决二义性问题
那时因为base类里面没有默认构造函数只有一个复制构造函数。你在base的public成员里面加一个构造函数就行了 base(){};

C++ 百科上 虚基类 的这三句话怎么理解啊?
第一个原则和第二个原则是讲的是多重继承的情况,假设一个类C继承了虚基类A和非虚基类B,那么按照第一条规则先调用A的构造函数,哪怕B的说明的次序在A之前 第二个原则是说如果AB都是虚基类或者非虚基类,就按写着的顺序,例如class C : A, B就是先A后B这样的 第三条只是一个补充,任何情况...

C++的虚基类的作用是什么
虚基类的作用是解决在多重继承中重复继承的问题

C++ 涉及虚基类的二义性问题 C++ Primer Plus 中的话有点让我觉得前后...
二义性规则主要就是这句吧:如果在某个路径中 X 是虚基类的成员,而在另一路径中 X 是后代派生类的成员,也没有二义性——特定派生类实例的优先级高于共享虚基类实例。很明显,LZ摘得这第二句貌似是不对的,或者是在其他的语境中,或者是作者的笔误 自己敲了个小实验验证一下:include <iostream...

相似回答