C/C++ 多态深入探究原理
多态(Polymorphism)是面向对象编程的重要特性之一,C++ 中多态的实现可以使用虚函数(Virtual Functions)和纯虚函数(Pure Virtual Functions)实现。
什么是多态
多态是一种面向对象编程的理念,它允许不同对象对同一个消息做出不同的响应。这意味着一个函数可以通过基类调用,却可以获得不同的结果。这种技术在面对许多继承类时,是非常有用的。
虚函数
虚函数是 C++ 实现多态的一种基础方式,C++ 使用虚表来实现。 虚函数需要使用关键字 virtual
来在类定义中声明。当派生类重载该函数时,派生类同样使用 virtual
来声明,这样可以使得在基类中定义的函数能够动态地被派生类所重载。
class Base {
public:
virtual void function() {
cout << "This is Base::function()" << endl;
}
};
class Derive : public Base {
public:
void function() override {
cout << "This is Derive::function()" << endl;
}
};
int main() {
Base* bPtr = new Base();
bPtr->function();
Derive* dPtr = new Derive();
dPtr->function();
Base* bd = new Derive();
bd->function();
}
上述示例中,我们定义了一个 Base
类和一个 Derive
类(它从 Base
类继承而来)。Base
类中包含一个指向虚函数的指针,该函数被称为虚函数。在 Derive
类中,重新定义了虚函数。当我们调用 Base
类的 function()
方法,并将其设置为指向 Derive
类的对象时,我们可以看到实际调用的是 Derive
类中的 function()
方法,这就是 C++ 中实现多态的一个典型的示例。
输出结果:
This is Base::function()
This is Derive::function()
This is Derive::function()
可以看到,当直接调用前两个 function()
方法时,分别得到了来自 Base
类和 Derive
类的输出。但是,当调用来自指向派生类 Derive
对象的基类指针的 function()
方法时,仍然获取到的是 Derive
类中的 function()
方法的输出。
纯虚函数
纯虚函数是一种没有实现体的虚函数。它只有声明语句,在类中不会被实现。纯虚函数可以作为 C++ 中接口的一种实现方式,并且定义了继承该类的派生类所必须实现的接口。
class Shape {
public:
virtual float area() const = 0;
};
class Rectangle:public Shape {
public:
Rectangle(float width, float height): _width(width), _height(height) {}
float area() const override {
return _width * _height;
}
private:
float _width;
float _height;
};
class Circle:public Shape {
public:
Circle(float radius): _radius(radius) {}
float area() const override {
return 3.14 * _radius * _radius;
}
private:
float _radius;
};
int main() {
// Shape s; // compile error
Rectangle r(10, 2);
cout << "Rectangle has an area of " << r.area() << endl;
Circle c(3);
cout << "Circle has an area of " << c.area() << endl;
return 0;
}
在上面的示例中,Shape
是一个抽象类(也就是包含纯虚函数的类),并不能创建它的对象。Rectangle
和 Circle
都继承自 Shape
类,并且重载了它的 area()
函数。实现了 area()
函数之后,我们可以创建这两种类型的对象,并计算它们的面积。
输出结果:
Rectangle has an area of 20
Circle has an area of 28.26
总结
多态是面向对象编程的一个重要特性,可以通过虚函数和纯虚函数来实现。虚函数可以被继承类所重载,这使得同样的功能可以根据具体的上下文来呈现出不同的行为。纯虚函数可以被继承类所实现(必须实现),这样就为继承树中的派生类定义了一套规则。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C/C++多态深入探究原理 - Python技术站