多态(Polymorphism)是面向对象编程中一个重要的概念,它允许不同的对象对同一消息作出不同的响应。在C++中,多态性主要通过虚函数和纯虚函数实现。
1. 虚函数(Virtual Functions):
虚函数是在基类中声明为虚函数的函数,可以在派生类中重写。当使用基类指针或引用调用虚函数时,根据指针或引用所指向的对象的实际类型,决定调用哪个版本的函数。
示例:
#include <iostream>
class Shape {
public:
virtual void draw() {
std::cout << "Drawing shape" << std::endl;
}
};
class Circle : public Shape {
public:
void draw() override {
std::cout << "Drawing circle" << std::endl;
}
};
class Rectangle : public Shape {
public:
void draw() override {
std::cout << "Drawing rectangle" << std::endl;
}
};
int main() {
Shape* shape1 = new Circle();
Shape* shape2 = new Rectangle();
shape1->draw(); // 调用Circle类的draw函数
shape2->draw(); // 调用Rectangle类的draw函数
delete shape1;
delete shape2;
return 0;
}
在上面的示例中,Shape
类有一个虚函数draw
,并且Circle
和Rectangle
类分别重写了这个函数。通过使用基类指针调用draw
函数,根据指针所指向的对象的实际类型,确定调用哪个版本的draw
函数。
2. 纯虚函数和抽象类(Pure Virtual Functions and Abstract Classes):
纯虚函数是在基类中声明为纯虚函数的虚函数,没有实现,派生类必须实现它们。包含至少一个纯虚函数的类被称为抽象类,不能实例化抽象类的对象。
示例:
#include <iostream>
class Shape {
public:
virtual void draw() = 0; // 纯虚函数
};
class Circle : public Shape {
public:
void draw() override {
std::cout << "Drawing circle" << std::endl;
}
};
class Rectangle : public Shape {
public:
void draw() override {
std::cout << "Drawing rectangle" << std::endl;
}
};
int main() {
// Shape* shape = new Shape(); // 错误,无法实例化抽象类
Shape* shape1 = new Circle();
Shape* shape2 = new Rectangle();
shape1->draw(); // 调用Circle类的draw函数
shape2->draw(); // 调用Rectangle类的draw函数
delete shape1;
delete shape2;
return 0;
}
在上面的示例中,Shape
类包含一个纯虚函数draw
,因此它是一个抽象类,不能被实例化。Circle
和Rectangle
类继承自Shape
类并实现了draw
函数。