编写一个抽象类Shape,包含一个虚函数 Perimeter (周长),与一个纯虚函数 Area (面积)。再编写一个 Circle (圆形)类与一个 Rectangle (矩形类),这两个类继承 Shape 类,并对 Perimeter
与 Area 函数进行重载。派生类的成员变量根据实际情况自己确定。
#include <iostream>
using namespace std;
class shape {
public:
virtual void perimeter()//虚函数周长
{
cout << "周长" << endl;
}
virtual void area() = 0;//纯虚函数面积
protected:
double a;
};
class circle :public shape { //圆
double rad;
public:
circle(double r) :rad(r) {}
void perimeter()
{
cout << "这个圆的周长为" << 2 * 3.14 * rad << endl;
}
void area()
{
cout << "这个圆的面积为" << 3.14 * rad * rad << endl;
}
};
class rectangle :public shape { //矩形
private:
double width; // 矩形的宽
double height; // 矩形的高
public:
rectangle(double w, double h) : width(w), height(h) {}
void perimeter()
{
cout << "这个矩形的周长为" << 2*width+2*height << endl;
}
void area()
{
cout << "这个矩形的面积为" << width * height << endl;
}
};
int main()
{
circle c1(3);
c1.perimeter();
c1.area();
rectangle r1(10, 5);
r1.perimeter();
r1.area();
}
基类shape
在移除了带有a
参数的构造函数后,并没有显式地定义任何构造函数。因此,编译器会为shape
类自动生成一个默认的默认构造函数(也称为隐式默认构造函数),这个构造函数不接受任何参数,并且不执行任何操作(即它是一个空操作)。
这个隐式默认构造函数会在以下情况下被调用:
- 当创建
shape
类型的对象但没有提供任何初始化参数时。 - 当从
shape
类派生其他类,并且派生类的构造函数没有显式调用基类构造函数时(此时编译器会隐式地调用基类的默认构造函数)。
注意,由于shape
类包含了一个纯虚函数area()
,它本身是一个抽象类,不能直接创建shape
类的对象。但是,这并不影响编译器为shape
类生成隐式默认构造函数的能力。这个隐式默认构造函数仅用于在派生类对象创建时初始化基类部分。
在C++中,如果基类有一个默认构造函数(即没有参数的构造函数),并且你没有在派生类的初始化列表中显式调用基类的构造函数,那么编译器会自动调用基类的默认构造函数来初始化基类部分。这是默认的、隐式的行为。
默认构造函数的用途
- 对象初始化:默认构造函数提供了一种简单的方式来初始化类的对象,而不需要提供任何特定的初始化参数。
- 与容器类交互:当你使用标准库中的容器类(如
std::vector
、std::list
等)时,这些容器类可能会需要创建对象的副本。在这种情况下,默认构造函数会被调用,以确保对象可以被正确地复制。 - 与多态性结合使用:在面向对象的编程中,多态性是一个重要的概念。默认构造函数允许你创建基类对象的指针或引用,这些指针或引用可以指向派生类的对象。当你通过这些指针或引用调用虚函数时,会发生动态绑定,从而执行与对象实际类型相对应的函数。
- 动态内存分配:当你使用
new
运算符在堆上动态地分配内存时,默认构造函数会被调用以初始化新创建的对象。
自己写的,如有不对请指正。