C++中的抽象类

本文探讨了抽象类和纯虚函数的概念,解释了抽象类如何确保类家族拥有统一的接口,以及为何抽象类不能实例化对象。通过具体的C++代码示例,展示了如何定义和使用抽象类及其实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意:
1.抽象类主要是使得整个类家族拥有相同的接口,便于对整个类的对象做批处理操作;
2.因为抽象类中包含纯虚函数,所以抽象类不能实例化出对象。

/*----------------------------
功能:抽象类的定义与实现
运行结果:
Calling Base2::display()...
Calling Derived::display()...
------------------------------
Author: Zhang Kaizhou
Date: 2019-4-13 11:03:28
-----------------------------*/
#include <iostream>

using namespace std;

class Base1{ // 含有纯虚函数的类为抽象类,抽象类不能实例化对象
public:
    virtual void display() const = 0; // 纯虚函数
};

class Base2 : public Base1{ // 以公有方式继承Base1
public:
    virtual void display() const; // 覆盖基类中的虚函数
};

void Base2::display() const{
    cout << "Calling Base2::display()..." << endl;
}

class Derived : public Base2{ // 以公有方式继承Base2
public:
    virtual void display() const; // 覆盖Base2中的函数
};

void Derived::display() const{
    cout << "Calling Derived::display()..." << endl;
}

void func(Base1 * ptr){ // 形参为Base1类的指针
    ptr->display(); // 通过指针调用display()函数
}

int main(){
    Base2 base2;
    Derived derived;
    func(&base2); // 将Base2类的对象的指针传递给func()函数
    func(&derived); // 将Derived类的对象的指针传递给func()函数

    return 0;
}

### C++抽象类定义、使用方法及特性 #### 定义抽象类C++中,抽象类是通过包含至少一个纯虚函数来定义的。纯虚函数是一种没有具体实现的虚函数,它通过`= 0`的形式声明[^2]。例如: ```cpp class AbstractClass { public: // 纯虚函数,使得AbstractClass成为抽象类 virtual void pureVirtualFunction() = 0; // 虚析构函数(防止派生类析构时,不调用派生类的析构函数) virtual ~AbstractClass() {} // 普通成员函数 void concreteFunction() { // 可以包含具体实现 } // 普通成员变量 int data; }; ``` #### 使用抽象类 抽象类不能被实例化,只能作为基类被其他类继承[^4]。任何继承自抽象类的子类必须实现所有的纯虚函数,否则该子类也将被视为抽象类。例如: ```cpp class DerivedClass : public AbstractClass { public: // 实现纯虚函数 void pureVirtualFunction() override { // 具体实现 } }; ``` #### 抽象类的特性 1. **不能实例化**:抽象类不能直接创建对象,只能通过其派生类来间接使用[^4]。 2. **可以包含非抽象成员**:抽象类可以包含普通成员函数和成员变量,这些成员可以在派生类中直接使用。 3. **强制实现接口**:通过定义纯虚函数,抽象类可以强制要求派生类实现特定的行为[^1]。 4. **构造与析构**:尽管抽象类不能被实例化,但其构造函数和析构函数仍然会被调用,用于初始化派生类的对象[^4]。特别地,抽象类的析构函数通常被声明为虚函数,以确保在销毁派生类对象时能够正确调用派生类的析构函数。 5. **不能使用`final`修饰**:抽象类不能使用`final`关键字修饰,因为`final`修饰的类不允许被继承[^4]。 #### 示例代码 以下是一个完整的示例,展示如何定义和使用抽象类: ```cpp #include <iostream> using namespace std; const double PI = 3.14159; // 抽象类 class Shapes { protected: int x, y; public: void setvalue(int d, int w = 0) { x = d; y = w; } // 纯虚函数 virtual void disp() = 0; }; // 派生类1 class Square : public Shapes { public: void disp() { cout << "矩形面积:" << x * y << endl; } }; // 派生类2 class Circle : public Shapes { public: void disp() { cout << "圆面积:" << PI * x * x << endl; } }; int main() { Shapes* shape1 = new Square(); shape1->setvalue(4, 5); shape1->disp(); // 输出矩形面积 Shapes* shape2 = new Circle(); shape2->setvalue(3); shape2->disp(); // 输出圆面积 delete shape1; delete shape2; return 0; } ``` #### 注意事项 - 如果派生类没有实现所有纯虚函数,则该派生类仍然是抽象类,无法实例化[^3]。 - 抽象类中的纯虚函数必须在派生类中重新声明并定义,且函数签名必须完全一致[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值