谭浩强C++ 第十二章

本文主要探讨了C++第十二章的课后习题,涉及了函数重载和虚函数的概念及应用。通过修改例题12.1和12.3,深入理解了静态多态和动态多态的区别。同时,通过创建抽象基类和使用基类指针数组来计算图形面积和,进一步展示了多态性在实际编程中的运用。
摘要由CSDN通过智能技术生成

第十二章课后习题

1、修改例12.1(P381)
//未修改课本原程序,各部分整合在一个文件中
#include<iostream>
using namespace std;
class Point{
   
	public:
		Point(float x=0,float y=0);//有默认参数的构造函数 
		void setPoint(float,float);
		float getX() const{
   //常成员函数,只可访问不可修改 
			return x;
		}
		float getY() const{
   
			return y;
		}
		friend ostream &operator <<(ostream &,const Point&);//重载作为友元成员函数 
	protected:
		float x;
		float y;
};
Point::Point(float a,float b){
   
	x=a;
	y=b;
} 
void Point::setPoint(float a,float b){
   //设置新的坐标 
	x=a;
	y=b;
} 
ostream &operator <<(ostream &output,const Point &p){
   //重载函数,重载运算符输出point 
	output<<"["<<p.x<<","<<p.y<<"]"<<endl;
	return output;
}
class Circle:public Point{
   
	public:
		Circle(float x=0,float y=0,float r=0);
		void setRadius(float);
		float getRadius() const;
		float area ()const;
		friend ostream &operator <<(ostream &,const Circle &);
	//private:
	protected:
		float radius;
};
/*Circle::Circle(float x,float y,float r):Point(x,y){
	radius=r;
} */
Circle::Circle(float x,float y,float r):Point(x,y),radius(r){
   
} 
void Circle::setRadius(float r){
   
	radius=r;
} 
float Circle::getRadius() const{
   
	return radius;
}
float Circle::area() const{
   
	return 3.1415926*radius*radius;
}
ostream &operator <<(ostream &output,const Circle &c){
   //重载函数,重载运算符输出point 
	output<<"Center=["<<c.x<<","<<c.y<<"],r="<<c.radius<<",area="<<c.area()<<endl;
	return output;
}
class Cylinder:public Circle{
   
	public:
		Cylinder(float x=0,float y=0,float r=0,float h=0);
		void setHeight(float );
		float getHeight() const;
		float area() const;//派生类和其直接基类都有area函数,这个时候采取同名覆盖原则,并不是重载,同名覆盖,基类的同名函数对派生类不可见 
		float Volume() const;//若想在这样的情况下访问基类的同名函数需要在前面加上基类名 
		friend ostream& operator<<(ostream &,const Cylinder&);
	protected:
		float height;
		
}; 
Cylinder::Cylinder(float x,float y,float r,float h):Circle(x,y,r),height(h){
   	
}
void Cylinder::setHeight(float h){
   
	height=h;
} 
float Cylinder::getHeight() const{
   
	return height;
}
float Cylinder::area() const{
   
	return 3.1415926*2*radius*height+2*3.14159262*radius*radius;
}
float Cylinder::Volume() const{
   
	return 3.1415926*radius*radius*height;
}
ostream& operator<<(ostream &output,const Cylinder &cy){
   
	output<<"Center=["<<cy.x<<","<<cy.y<<"],r="<<cy.radius<<",h="<<cy.height<<endl
	<<"area="<<cy.area() <<",volume="<<cy.Volume() <<endl;
	return output;
}
int main(){
   
	cout<<"**********************************************"<<endl;
	Point p(3.5,6.4);
	cout<<"x="<<p.getX() <<",y="<<p.getY() <<endl;
	cout<<"original p:"<<endl<<p<<endl;
	p
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值