python 做网站,百度云建站,网上书店网站建设毕业设计,记事本做网站素材代码系列文章目录
总目录链接 文章目录 系列文章目录总目录链接 C面试基础系列-abstractOverview1.abstract关键点2.C 抽象类和纯虚函数的例子3.abstract重点关于作者 C面试基础系列-abstract
Overview
在C中#xff0c;abstract这个概念主要与抽象类#xff08;Abstract Clas…系列文章目录
总目录链接 文章目录 系列文章目录总目录链接 C面试基础系列-abstractOverview1.abstract关键点2.C 抽象类和纯虚函数的例子3.abstract重点关于作者 C面试基础系列-abstract
Overview
在C中abstract这个概念主要与抽象类Abstract Class相关。抽象类是一种不能被实例化的类它通常包含至少一个纯虚函数Pure Virtual Function。抽象类用于定义接口或行为规范可以被其他类继承并实现具体的功能。
1.abstract关键点
以下是一些关于C中抽象类的关键点
纯虚函数 纯虚函数是在基类中声明但没有实现的虚函数其声明方式是在函数声明的末尾加上 0。例如virtual void doSomething() 0; 抽象类的定义 包含至少一个纯虚函数的类就是抽象类。抽象类不能被直接实例化但可以被用作其他类的基类。 继承抽象类 派生类必须实现基类中的所有纯虚函数否则派生类也会是抽象类。 接口定义 抽象类通常用于定义接口让不同的派生类实现相同的接口。 多态性 抽象类支持多态性可以通过基类指针或引用调用派生类重写的虚函数。 示例
// 抽象类声明
class Shape {
public:virtual void draw() const 0; // 纯虚函数virtual ~Shape() {} // 虚析构函数确保派生类析构正确性
};// 派生类实现抽象类
class Circle : public Shape {
public:void draw() const override {// 绘制圆形的代码}
};// 使用抽象类
Shape* shape new Circle();
shape-draw();
delete shape;抽象类的作用 强制实现接口确保所有派生类都实现了抽象类中定义的纯虚函数。代码复用基类可以提供一些通用的实现派生类可以重写或继承这些实现。 设计原则 遵循里氏替换原则Liskov Substitution Principle确保派生类可以替换其基类。 注意事项 抽象类通常包含虚析构函数以确保派生类的析构函数被正确调用。 C11及以后版本 C11引入了final关键字可以修饰类或成员函数表示它们不能被进一步继承或重写。
抽象类是C面向对象编程中的一个重要概念它有助于实现代码的模块化和可扩展性。通过使用抽象类开发者可以定义清晰的接口并在不同的派生类中实现这些接口的具体行为。
2.C 抽象类和纯虚函数的例子
在这个例子中Shape 是一个抽象类它定义了一个纯虚函数 getArea。 Circle 和 Rectangle 是 Shape 的派生类它们分别实现了 getArea 函数。由于 Shape 是抽象类我们不能直接创建它的实例但可以创建 Circle 和 Rectangle 的实例。
#include iostream// 抽象基类
class Shape {
public:// 纯虚函数用于计算面积virtual double getArea() const 0;// 虚析构函数virtual ~Shape() {}
};// 派生类 Circle
class Circle : public Shape {
public:// 构造函数Circle(double radius) : radius(radius) {}// 实现基类的纯虚函数double getArea() const override {return 3.14159 * radius * radius;}private:double radius;
};// 派生类 Rectangle
class Rectangle : public Shape {
public:// 构造函数Rectangle(double width, double height) : width(width), height(height) {}// 实现基类的纯虚函数double getArea() const override {return width * height;}private:double width, height;
};int main() {// 由于 Shape 是抽象类不能直接实例化// Shape shape; // 错误Circle circle(5.0);Rectangle rectangle(4.0, 6.0);std::cout Circle area: circle.getArea() std::endl;std::cout Rectangle area: rectangle.getArea() std::endl;return 0;
}3.abstract重点
纯虚函数使一个类变成抽象类抽象类类型的指针和引用如果我们不在派生类中覆盖纯虚函数那么派生类也会变成抽象类抽象类可以有构造函数构造函数不能是虚函数而析构函数可以是虚析构函数
// 抽象类
class Base {
public:Base(){ cout Constructor: Base endl; }virtual ~Base(){ cout Destructor : Base endl; }virtual void func() 0;
};class Derived: public Base {
public:Derived(){ cout Constructor: Derived endl; }~Derived(){ cout Destructor : Derived endl;}void func(){cout In Derived.func(). endl;}
};当基类指针指向派生类对象并删除对象时我们可能希望调用适当的析构函数。 如果析构函数不是虚拟的则只能调用基类析构函数。 关于作者
微信公众号:WeSiGJGitHub:https://github.com/wesigj/cplusplusboysCSDN:https://blog.csdn.net/wesigj微博:-版权声明本文为博主原创文章遵循 CC 4.0 BY-SA 版权协议转载请附上原文出处链接和本声明。