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

引用基类构造函数,该怎么处理

2012-02-21 
引用基类构造函数引用基类构造函数classCar:publicVehicle{public:Car(intaird,floatspeed,inttotal):Vehi

引用基类构造函数
引用基类构造函数
class   Car:public   Vehicle  
{  
public:  
Car(int   aird,float   speed,int   total):Vehicle(speed,total)  
{  
Car::aird=aird;  
}  
void   ShowMember()  
{  
cout < <speed < < "| " < <total < < "| " < <aird < <endl;  
}  
protected:  
int   aird;  
};  
这句Car(int   aird,float   speed,int   total):Vehicle(speed,total)  
它应该是在调用基类的构造函数是吧?
那这么写和下面这么写有何区别呢?
Car(int   aird,float   speed,int   total)
{  
base(speed,total);
Car::aird=aird;  
}  


[解决办法]
Car(int aird,float speed,int total):Vehicle(speed,total)
{
Car::aird=aird;
}
============================
在执行构造函数之前,对象已经建立,在构造函数代码中进行的是赋值
写成这
Car(int aird,float speed,int total)
{
//... ...
}
的话需基类存在一个缺省构造函数,这样才能正确的进行编译

[解决办法]
首先,如果父类没有提供默认构造函数(既不要任何参数的构造函数),那么子类就必须在成员初始化表里调用父类的可用构造函数,以初始化父类成员speed、total。
class Car:public Vehicle
{
public:
Car(int aird,float speed,int total):Vehicle(speed,total)
{
}
………………
};

其次,如果父类已经提供了默认构造函数,那么不使用成员初始化表调用父类的构造函数。那么父类的成员speed、total并没有使用Car的第2和第3个参数进行赋值。
期望的赋值语句可以在Car的构造函数写为
Car(int aird,float speed,int total):Vehicle(speed,total)
{
Vehicle::speed = speed ;
Vehicle::total = total ;
Car::aird = aird ;
}
另,C++中没有base关键字,无法把它当作父类的构造函数来使用。近似的有Car()

Car(int aird,float speed,int total)
{
Car(speed,total); //这里是使用Car的构造函数再次定义出一个局部对象
Car::aird=aird;
}
仅仅是定义了一个局部对象,她不会初始化(*this)对象的成员。那句根本一点用没有。
[解决办法]
class A
{
public:
A(){i = 3;}
A(int ivl){i = ivl;}
protected:
int i;
};

class B : public A
{
public:
B(int a, int b, int c):A(a), j(b), k(c){}
B(int b, int c)
{
//A();
//A(10);
//A(30);
//只是执行函数,不对B的对象数据成员赋值,因为在进入B的构造函数代码的时候
//对象已经建立,i的值为3,若改值
//i = 10;
j = b;
k = c;
}
void show()
{
cout < < "i = " < < i < < endl
< < "j = " < < j < < endl
< < "k = " < < k < < endl;
}
private:
int j;
int k;
};

int main()
{
B b(6, 8);
b.show();

return 0;
}
[解决办法]
Car(int aird,float speed,int total)
{
base(speed,total);
============================================
首先,C++中没有“base”这么个关键字,那是C#才有的。也没有Java中的“super”。
如果你想写:
Vehicle(speed, total)。
也是不对的。
函数体内的所有语句都是平等的,都是一样的定义变量或执行动作的语句,而不存在初始化基类子对象的专用语句,这点跟JAVA不一样。
你这条语句就是定义了一个没有名字的临时对象,而且也没有使用它,定义完就拉岛了,他的类型为Vehicle。这个跟构造函数初始化列表中对父类子对象的初始化根本不是一回事,不可相提并论。

类似这种的“定义无名临时变量”的例子再比如:
int main() {
int(5);
return 0;
}

热点排行