//点圆球体运行时多态:由圆类继承点类,球类继承圆类,实现求面积和体积,要求多态实现
#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++中的一个纯虚函数声明。我们来逐个解析这个语句的各个部分:
virtual
:这是一个关键字,用于声明一个函数为虚函数。虚函数允许在派生类中被重写(override),从而实现多态性。多态性是面向对象编程的三大特性之一,它允许我们使用基类指针或引用调用派生类中的函数。double
:这是函数的返回类型。在这个例子中,函数返回一个double
类型的值。area
:这是函数的名称。在这个上下文中,它可能表示一个用于计算面积的函数。()
:这表示该函数不接受任何参数。= 0;
:这表示该函数是一个纯虚函数。纯虚函数是一种特殊的虚函数,它在基类中没有实现(即函数体为空)。一个类如果包含至少一个纯虚函数,那么该类就成为抽象类,不能被实例化。派生类必须提供这个纯虚函数的实现,除非派生类也打算成为抽象类。
综合起来,virtual double area() = 0;
声明了一个返回类型为double
的纯虚函数area
,该函数不接受任何参数。由于这是一个纯虚函数,包含它的类将成为一个抽象类,不能直接实例化。任何从该抽象类派生的子类都必须提供area
函数的具体实现,除非该派生类也声明为抽象类。
在实际应用中,这样的设计通常用于定义一个接口或抽象基类,其中area
函数表示一个需要由具体子类来实现的行为或属性。例如,如果我们有一个表示形状的基类Shape
,并且我们想要不同的形状子类(如Circle
、Rectangle
等)来计算自己的面积,我们就可以在Shape
类中声明area
为纯虚函数,然后在每个形状子类中提供具体的实现。
Point(const double& x, const double& y)
看起来像一个类Point
的构造函数声明,它接受两个const double&
类型的参数。下面我会逐一解析这个语句的各个部分:
-
Point
:这是类的名称,表示我们正在定义一个名为Point
的类的构造函数。 -
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_
。这是一种高效的初始化成员变量的方式。