C++期末复习刷题(12)(点圆球体运行时多态)

//点圆球体运行时多态:由圆类继承点类,球类继承圆类,实现求面积和体积,要求多态实现
#include<iostream>
using namespace std;
 
const double pi = 3.14;
 
class Point
{
private:
	double _x, _y;
public:
	Point(const double& x, const double& y)
	{//这种加const写法的才是最标准的,因为应付期末,没有那么高的要求的
		_x = x;
		_y = y;
	}
	virtual double area() = 0;
	virtual double volume() = 0;
};
 
class Circle : public Point
{
protected:
	double _r;
public:
	Circle(double x, double y, double r)
		:Point(x, y)
	{
		_r = r; 
	}
	virtual double area()
	{	//圆的面积:π*r*r
		return pi * _r * _r;
	}
	virtual double volume()
	{
		return 0.0;
	}
};
//球体类
class Sphere : public Circle
{
private:
	double _z; //因为球体的是三维的,所以它的圆心应该再增加一个维度
public:
	Sphere(double x, double y, double r, double z)
		:Circle(x, y, r)
	{
		_z = z;
	}
	double area()
	{
		return 4 * pi * _r * _r;
	}
	double volume()
	{   //V=(4/3)πr^3
		return 4 * pi * _r * _r * _r / 3;
	}
};
 
 
int main()
{
	Point* p;
	Circle c(1.1, 1.2, 1.3);
	Sphere s(1.2, 1.3, 1.4, 1.5);
	p = &c;
	cout << " circle: " << p->area() << "\t\t" << p->volume() << endl;
	p = &s;
	cout << " sphere: " << p->area() << "\t" << p->volume() << endl;
 
	return 0;
}

该语句是C++中的一个纯虚函数声明。我们来逐个解析这个语句的各个部分:

  1. virtual:这是一个关键字,用于声明一个函数为虚函数。虚函数允许在派生类中被重写(override),从而实现多态性。多态性是面向对象编程的三大特性之一,它允许我们使用基类指针或引用调用派生类中的函数。
  2. double:这是函数的返回类型。在这个例子中,函数返回一个double类型的值。
  3. area:这是函数的名称。在这个上下文中,它可能表示一个用于计算面积的函数。
  4. ():这表示该函数不接受任何参数。
  5. = 0;:这表示该函数是一个纯虚函数。纯虚函数是一种特殊的虚函数,它在基类中没有实现(即函数体为空)。一个类如果包含至少一个纯虚函数,那么该类就成为抽象类,不能被实例化。派生类必须提供这个纯虚函数的实现,除非派生类也打算成为抽象类。

综合起来,virtual double area() = 0; 声明了一个返回类型为double的纯虚函数area,该函数不接受任何参数。由于这是一个纯虚函数,包含它的类将成为一个抽象类,不能直接实例化。任何从该抽象类派生的子类都必须提供area函数的具体实现,除非该派生类也声明为抽象类。

在实际应用中,这样的设计通常用于定义一个接口或抽象基类,其中area函数表示一个需要由具体子类来实现的行为或属性。例如,如果我们有一个表示形状的基类Shape,并且我们想要不同的形状子类(如CircleRectangle等)来计算自己的面积,我们就可以在Shape类中声明area为纯虚函数,然后在每个形状子类中提供具体的实现。

Point(const double& x, const double& y) 看起来像一个类Point的构造函数声明,它接受两个const double&类型的参数。下面我会逐一解析这个语句的各个部分:

  1. Point:这是类的名称,表示我们正在定义一个名为Point的类的构造函数。

  2. const double& x 和 const double& y

    • const:这表示传递给构造函数的参数是常量,即构造函数内部不能修改这些参数的值。这是一种保证参数不被意外修改的安全措施。
    • double&:这表示参数是通过引用传递的。在C++中,通过引用传递参数可以避免拷贝成本,特别是对于大型对象来说,这可以显著提高效率。在这个例子中,虽然double是一个基本数据类型,使用引用传递可能不会带来显著的性能提升,但它仍然表明了程序员希望避免不必要的拷贝,并且可能还希望在函数内部直接操作传递进来的实际变量(尽管在这个const的上下文中是不可能的)。
    • x 和 y:这是传递给构造函数的两个参数的名称,它们分别代表点的x坐标和y坐标。

综上所述,Point(const double& x, const double& y) 是一个构造函数的声明,用于初始化Point类的对象。这个构造函数接受两个常量引用类型的double参数,分别表示点的x和y坐标。由于这些参数被声明为const,因此构造函数不能修改它们的值。

在类的实现中,这个构造函数可能会类似于以下形式:

class Point {  
private:  
    double x_;  
    double y_;  
  
public:  
    Point(const double& x, const double& y) : x_(x), y_(y) {  
        // 构造函数的实现,可以使用初始化列表来初始化成员变量  
    }  
  
    // 类的其他成员函数和数据...  
};


在这个例子中,构造函数使用初始化列表来初始化成员变量x_y_。这是一种高效的初始化成员变量的方式。

  • 16
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值