c++抽象类 abstract class

一、概念

抽象类只表达一个概念,并不与具体的对象联系,通常为它的派生类提供一个算法框架。需要注意的是,抽象类不光没有对象,也不能声明此类型,即抽象类型不能作为参数和返回值类型等。纯虚函数是一种特殊的虚函数,这种函数名称定义只有声明。 纯虚函数的语法格式如下:

virtual 返回值类型 函数名(参数列表) = 0;

抽象类 ←→ 纯虚函数

如果一个类是抽象类,则内部必然有纯虚函数;如果一个类有纯虚函数,其必然是抽象类。

#include <iostream>

using namespace std;

/**

* @brief The Shape class

* 抽象基类:形状类

*/

class Shape

{

public:

// 纯虚函数声明

virtual void area() = 0; // 面积

virtual void perimeter() = 0; // 周长

};

int main()

{

// Shape s; 错误

return 0;

}

二、用法

用法一:派生类继承抽象基类,把所有的纯虚函数覆盖并增加函数体。

#include <iostream>

using namespace std;

/**

* @brief The Shape class

* 抽象基类:形状类

*/

class Shape

{

public:

// 纯虚函数声明

virtual void area() = 0; // 面积

virtual void perimeter() = 0; // 周长

};

/**

* @brief The Circle class

* 圆形

*/

class Circle:public Shape

{

public:

void area()

{

cout << "πR^2" << endl;

}

void perimeter() override

{

cout << "2πR" << endl;

}

};

int main()

{

// Shape s; 错误

Circle c;

c.area();

c.perimeter();

return 0;

}
用法二:派生类继承抽象基类后,没有把所有的纯虚函数覆盖并增加函数体,此时相当于继承了纯虚函数,此派生类也变为抽象类。

#include <iostream>

using namespace std;

/**

* @brief The Shape class

* 抽象基类:形状类

*/

class Shape

{

public:

// 纯虚函数声明

virtual void area() = 0; // 面积

virtual void perimeter() = 0; // 周长

};

/**

* @brief The Circle class

* 圆形

*/

class Circle:public Shape

{

public:

void area()

{

cout << "πR^2" << endl;

}

void perimeter() override

{

cout << "2πR" << endl;

}

};

/**

* @brief The Polygon class

* 多边形

*/

class Polygon:public Shape

{

public:

void perimeter()

{

cout << "∑边长" << endl;

}

};

/**

* @brief The Triangle class

* 三角形

*/

class Triangle:public Polygon

{

public:

void area()

{

cout << "w*h/2" << endl;

}

};

int main()

{

// Shape s; 错误

Circle c;

c.area();

c.perimeter();

// Polygon p; 错误

Triangle t;

t.perimeter();

t.area();

return 0;

}

三、多态

之前提到抽象类型不能被声明,但是由于抽象类支持多态,因此抽象类的指针和引用可以被声明。同时要注意因为支持多态,抽象类的析构函数都应该被设置为虚析构函数。

#include <iostream>

using namespace std;

/**

* @brief The Shape class

* 抽象基类:形状类

*/

class Shape

{

public:

// 纯虚函数声明

virtual void area() = 0; // 面积

virtual void perimeter() = 0; // 周长

// 虚析构函数

virtual ~Shape()

{

}

};

/**

* @brief The Circle class

* 圆形

*/

class Circle:public Shape

{

public:

void area()

{

cout << "πR^2" << endl;

}

void perimeter() override

{

cout << "2πR" << endl;

}

};

/**

* @brief The Polygon class

* 多边形

*/

class Polygon:public Shape

{

public:

void perimeter()

{

cout << "∑边长" << endl;

}

};

/**

* @brief The Triangle class

* 三角形

*/

class Triangle:public Polygon

{

public:

void area()

{

cout << "w*h/2" << endl;

}

};

void test_shape(Shape& s)

{

s.area();

s.perimeter();

}

void test_shape(Shape *s)

{

s->area();

s->perimeter();

}

int main()

{

// Shape s; 错误

Circle c;

c.area();

c.perimeter();

// Polygon p; 错误

Triangle t;

t.perimeter();

t.area();

test_shape(c);

test_shape(t);

Circle* c2 = new Circle;

Triangle* t2 = new Triangle;

test_shape(c2);

test_shape(t2);

delete c2;

delete t2;

return 0;

}

相关推荐
Lhuu(重开版1 小时前
JS:正则表达式和作用域
开发语言·javascript·正则表达式
点云SLAM1 小时前
C++内存泄漏检测之Windows 专用工具(CRT Debug、Dr.Memory)和Linux 专业工具(ASan 、heaptrack)
linux·c++·windows·asan·dr.memory·c++内存泄漏检测·c++内存管理
仙俊红1 小时前
Java Map 家族核心解析
java·开发语言
浅念-1 小时前
C语言小知识——指针(3)
c语言·开发语言·c++·经验分享·笔记·学习·算法
code_li2 小时前
聊聊支付宝架构
java·开发语言·架构
少控科技3 小时前
QT高阶日记01
开发语言·qt
无限进步_3 小时前
【C++】大数相加算法详解:从字符串加法到内存布局的思考
开发语言·c++·windows·git·算法·github·visual studio
“抚琴”的人3 小时前
C#上位机工厂模式
开发语言·c#
巨大八爪鱼3 小时前
C语言纯软件计算任意多项式CRC7、CRC8、CRC16和CRC32的代码
c语言·开发语言·stm32·crc
C+-C资深大佬3 小时前
C++ 数据类型转换是如何实现的?
开发语言·c++·算法