C++ 通过指针实现多态实例详解
多态是面向对象编程语言的一个重要特性。在 C++ 中,实现多态的方法有虚函数和虚函数表、函数指针和指针数组、以及指针和引用等。其中,通过指针实现多态是一种常用的方式。在本篇文章中,我们将详细讲解如何通过指针实现多态。
什么是多态
多态是指不同的对象以不同的方式响应相同的消息的能力,这意味着不同的对象可以接受相同的消息,但是却可以表现出不同的行为。例如,在一个图形类中,不同的子类可以有不同的绘制方法,但是它们都可以接收“绘制”这个消息。
如何通过指针实现多态
在 C++ 中,通过指针实现多态的方法是将子类对象的指针赋值给父类对象的指针,并使用虚函数来调用方法。因为虚函数可以通过指针调用子类的方法,所以这样可以保证正确地调用不同子类的方法。
以下是通过指针实现多态的详细步骤:
- 定义基类和子类的结构体,并在基类中定义虚函数。
class Shape {
public:
virtual void draw() { // 定义虚函数,使用 virtual 关键字
std::cout << "This is a shape." << std::endl;
}
};
class Circle : public Shape {
public:
void draw() { // 重写虚函数
std::cout << "This is a circle." << std::endl;
}
};
class Rectangle : public Shape {
public:
void draw() { // 重写虚函数
std::cout << "This is a rectangle." << std::endl;
}
};
- 在 main 函数中使用基类指针指向不同的子类对象。
int main() {
Shape* shapes[2]; // 定义基类指针的数组
Circle circle;
Rectangle rectangle;
shapes[0] = &circle; // 将子类对象的指针赋值给父类对象的指针
shapes[1] = &rectangle;
for (int i = 0; i < 2; ++i) {
shapes[i]->draw(); // 调用虚函数
}
return 0;
}
- 编译运行程序,输出结果为:
This is a circle.
This is a rectangle.
这说明成功地实现了通过指针实现多态。
示例说明
示例 1
在这个示例中,我们通过指针实现了动物类和其两个子类,马和狗。每个子类都有一个不同的叫声函数。我们通过指针数组,将不同的子类对象指针赋值给基类对象指针,然后调用虚函数,从而实现了多态。
#include <iostream>
class Animal {
public:
virtual void makeSound() { // 定义虚函数
std::cout << "This is an animal." << std::endl;
}
};
class Horse : public Animal {
public:
void makeSound() { // 重写虚函数
std::cout << "This is a horse. Neigh!" << std::endl;
}
};
class Dog : public Animal {
public:
void makeSound() { // 重写虚函数
std::cout << "This is a dog. Woof!" << std::endl;
}
};
int main() {
Animal* animals[2]; // 定义基类指针的数组
Horse horse;
Dog dog;
animals[0] = &horse; // 将子类对象的指针赋值给父类对象的指针
animals[1] = &dog;
for (int i = 0; i < 2; ++i) {
animals[i]->makeSound(); // 调用虚函数
}
return 0;
}
运行程序,输出结果为:
This is a horse. Neigh!
This is a dog. Woof!
示例 2
在这个示例中,我们通过指针实现了图形类和其两个子类,圆形和矩形。每个子类都有一个不同的绘制函数。我们通过指针数组,将不同的子类对象指针赋值给基类对象指针,然后调用虚函数,从而实现了多态。
#include <iostream>
class Shape {
public:
virtual void draw() { // 定义虚函数
std::cout << "This is a shape." << std::endl;
}
};
class Circle : public Shape {
public:
void draw() { // 重写虚函数
std::cout << "This is a circle." << std::endl;
}
};
class Rectangle : public Shape {
public:
void draw() { // 重写虚函数
std::cout << "This is a rectangle." << std::endl;
}
};
int main() {
Shape* shapes[2]; // 定义基类指针的数组
Circle circle;
Rectangle rectangle;
shapes[0] = &circle; // 将子类对象的指针赋值给父类对象的指针
shapes[1] = &rectangle;
for (int i = 0; i < 2; ++i) {
shapes[i]->draw(); // 调用虚函数
}
return 0;
}
运行程序,输出结果为:
This is a circle.
This is a rectangle.
结论
通过指针实现多态是 C++ 中一种常用的实现多态的方式。它让不同的子类对象以不同的方式响应相同的消息,从而实现了多态。在使用中要注意虚函数的定义和指针的使用,才能保证程序的正确性和可读性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 通过指针实现多态实例详解 - Python技术站