c++中的抽象类

本文介绍了面向对象编程中抽象类的概念及其使用方法。详细解释了如何定义包含纯虚函数的抽象类,并展示了如何在派生类中实现这些纯虚函数以避免编译错误。此外,还探讨了纯抽象类的概念。

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

在面向对象的编程过程中,有些类的创建是毫无意义的,它的概念是抽象的,比如动物,电器,人这样类,比如到商店给店员说我要买一台电器。编程过程中可以将这些类设置为抽象类,以防止它们创建对象。


只要一个类中出现纯虚函数,那么这个类就是抽象类。

Class Animal{

         Public:

virtual void show() = 0;//纯虚函数的表达

};

抽象类除了不能实例化之外,和其他类没有任何区别。

/**/
#include <iostream>
#include <string>
using namespace std;

class Animal{
	string name;
	int age;
public:
	Animal(string name = "",int age=0):name(name),age(age){
		//cout << ""
	}
	/*纯虚函数*/
	virtual void fun() = 0;
	/*普通函数*/
	void show(){
		cout << name<<":"<<age<<endl;
	}
};

class Dog:public Animal{
public:
	void fun(){
		cout << "dog fun()"<<endl;
	}
	Dog(string name = "",int age = 0):
		Animal(name,age){}
};
int main(){
	//Animal a;
	Dog dog("haha",6);//子类也会有纯虚函数,子类也是抽象类,所以子类必须实现抽象类
	dog.show();
}
值得注意的是,在继承一个抽象类中,如果不在派生类中重写这个方法的话,那么派生类依然会有父类的纯虚函数,此时派生类还是一个抽象类。所以要使得派生类可以创建对象,则要重写父类的纯虚函数。


纯抽象类:除了构造函数和析构函数之外的其他函数都是纯虚函数,这样的类就是纯抽象类。有意思的是,学过java的人其实应该比较清楚,java中不支持多继承,但是java却通过接口的方式实现了多继承所要达到的目的。java中的接口其实本质上就是c++中的纯抽象类。

### 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]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值