抽象基类与派生类:构造方法的注意事项
1.抽象基类的构造方法不要用纯虚函数
2.子类的属性名如果和抽象基类的属性名相同的情况下
下面内容为在遇到2类问题的情况和解决方法
2(1)
问题~:
class container{ //声明抽象类container
protected:
double radius;
public:
container(double _radius) //抽象类container的构造函数
{ radius=_radius; };
virtual double surface_area()=0; //纯虚函数surface_area
virtual double volume()=0; //纯虚函数volume
};
class cube:public container{
public:
cube(double radius):container(radius){
}
~cube(){
}
double getradius(){
return radius;
}
virtual double surface_area();
virtual double volume();
private:
double radius=-1;
double S,V;
};
通过子类对象调用getradius()方法的运行结果:
情况分析~:
这种情况下,基类和派生类有重名成员遍历,通过子类对象调用getradius()方法返回的是子类中的radius,但是在构造方法调用的是父类的构造方法给radius赋值,所以返回值是-1;
解决方法~:
2(2)
问题~:
class container{ //声明抽象类container
protected:
double radius;
public:
container(double _radius) //抽象类container的构造函数
{ radius=_radius; };
virtual double surface_area()=0; //纯虚函数surface_area
virtual double volume()=0; //纯虚函数volume
};
class cube:public container{
public:
cube(double radius):container(radius){
}
~cube(){
}
virtual double surface_area();
virtual double volume();
private:
double radius;
double S,V;
};
情况分析~:
因为没有调用父类构造方法,所以此时如果编译会报错,没有匹配抽象基类的构造方法
16 22 C:\Users\Lenovo\Desktop\未命名1.cpp [Error] no matching function for call to 'container::container()'
解决方法~:
调用基类的构造方法即可解决问题
cube(double radius):container(radius){
}
注意:可不只是基类是抽象基类的派生类才需要调用父类的构造方法,
只要是子类,都需要调用父类的构造方法!