本文共 2419 字,大约阅读时间需要 8 分钟。
在编程中,多态性是指同一符号或名字在不同情境下具有不同实现的现象。在C++中,有两种多态性:编译时的多态性和运行时的多态性。函数联编是指在函数调用时,根据具体情况选择适当的函数体进行链接。C++支持两种联编方式:静态联编和动态联编。
静态联编是在程序编译阶段完成的。其特点是速度快,但缺乏灵活性。编译时的多态性也称为静态多态性。以下示例展示了静态联编的工作原理:
#includeconst double PI = 3.14;using namespace std;class Figure { public: Figure() {} double area() const { return 0.0; }};class Circle : public Figure { public: Circle(double myr) { R = myr; } double area() const { return PI * R * R; } protected: double R;};class Rectangle : public Figure { public: Rectangle(double myl, double myw) { L = myl; W = myw; } double area() const { return L * W; } private: double L, W;};int main() { Figure fig; double area; area = fig.area(); cout << "Area of figure is " << area << endl;}
运行结果:
Area of figure is 0Area of circle is 28.26Area of rectangle is 20
静态联编的优点是运行速度快。根据对象赋值兼容原则,基类对象可以与派生类对象兼容,基类指针可以指向派生类对象,基类引用也可以引用派生类对象。
动态联编发生在程序运行时,适用于函数的多态性。动态联编需要满足三个条件:类型兼容原则、声明虚函数以及通过指针、引用或函数调用访问虚函数。
虚函数是动态联编的基础。虚函数在基类中声明,并可由派生类重新定义。虚函数需要满足以下条件:
以下示例展示了虚函数的使用:
#includeusing namespace std;class Base { public: virtual ~Base() {}};class Subclass : public Base { public: Subclass() {} ~Subclass() {}};int main() { Subclass sc; cout << "对象创建成功" << endl;}
运行结果:
对象创建成功
虚函数与一般函数重载有以下区别:
基类中的虚函数自动传给派生类,其虚特性保持不变。派生类可通过覆盖基类虚函数来维持多态性。
以下示例展示了不恰当虚函数的错误:
class Base { public: virtual int func(int x) { cout << "This is Base class"; return x; }};class Subclass : public Base { public: virtual int func(float x) { cout << "This is Sub class"; return x; }};运行结果:
This is Base classx=5This is Sub classx=5
以下示例展示了不正确覆盖虚函数的错误:```cppclass Subclass : public Base { public: virtual int func(int x) { cout << "This is Sub class"; return x; }}int main() { Base bp; cout << bp.func(5) << endl;}
运行结果:
0
成员函数可直接调用类等级中的虚函数:
class Base { public: virtual void func1() { cout << "This is Base class func1()" << endl; }};class Subclass : public Base { public: virtual void func1() { cout << "This is Sub class func1()" << endl; }};int main() { Subclass sc; sc.func1();}
运行结果:
This is Sub class func1()
在满足公有继承关系的情况下,成员函数中调用虚函数将采用动态联编。
转载地址:http://abirz.baihongyu.com/