0
点赞
收藏
分享

微信扫一扫

C++ 抽象基类与派生类

萨摩斯加士奇 2022-04-23 阅读 116
c++

抽象基类与派生类:构造方法的注意事项

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){
		}

注意:可不只是基类是抽象基类的派生类才需要调用父类的构造方法,
只要是子类,都需要调用父类的构造方法!

举报

相关推荐

0 条评论