编写一个抽象类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类自动生成一个默认的默认构造函数(也称为隐式默认构造函数),这个构造函数不接受任何参数,并且不执行任何操作(即它是一个空操作)。

   这个隐式默认构造函数会在以下情况下被调用:

  1. 当创建shape类型的对象但没有提供任何初始化参数时。
  2. 当从shape类派生其他类,并且派生类的构造函数没有显式调用基类构造函数时(此时编译器会隐式地调用基类的默认构造函数)。

   注意,由于shape类包含了一个纯虚函数area(),它本身是一个抽象类,不能直接创建shape类的对象。但是,这并不影响编译器为shape类生成隐式默认构造函数的能力。这个隐式默认构造函数仅用于在派生类对象创建时初始化基类部分。 

   在C++中,如果基类有一个默认构造函数(即没有参数的构造函数),并且你没有在派生类的初始化列表中显式调用基类的构造函数,那么编译器会自动调用基类的默认构造函数来初始化基类部分。这是默认的、隐式的行为。 

默认构造函数的用途

  1. 对象初始化:默认构造函数提供了一种简单的方式来初始化类的对象,而不需要提供任何特定的初始化参数。
  2. 与容器类交互:当你使用标准库中的容器类(如std::vectorstd::list等)时,这些容器类可能会需要创建对象的副本。在这种情况下,默认构造函数会被调用,以确保对象可以被正确地复制。
  3. 与多态性结合使用:在面向对象的编程中,多态性是一个重要的概念。默认构造函数允许你创建基类对象的指针或引用,这些指针或引用可以指向派生类的对象。当你通过这些指针或引用调用虚函数时,会发生动态绑定,从而执行与对象实际类型相对应的函数。
  4. 动态内存分配:当你使用new运算符在堆上动态地分配内存时,默认构造函数会被调用以初始化新创建的对象。

自己写的,如有不对请指正。