C++多态性

来源:互联网 发布:单片机程序编写时钟 编辑:程序博客网 时间:2024/06/05 16:15

多态,英文为Polymorphism,目的是将接口与实现分离,提供同一个接口,根据不同的情况,使用不同的实现策略。

函数的重载(overload)属于多态性,方法覆盖(override)属于多态性,虚函数(virtual关键字)同样也是为了实现多态性。

重载的例子(这里为了强调多态技术本身,例子尽量简单了):

#include <iostream>using std::cout;using std::endl;static inline void foo(void) {    cout << "foo version1\n";}static inline void foo(int a) {    cout << "foo version2: arg is " << a << endl;}static inline void foo(int a, char *str) {    cout << "foo version3: arg is " << a << ", " << str << endl;}int main(void){    foo();    foo(1);    foo(3, "hahaa");    return 0;}

程序的输出结果是

[root@localhost overload]# ./a.out 
foo version1
foo version2: arg is 1
foo version3: arg is 3, hahaa

同样,类中的方法也可以重载,下面是一个简单的例子

#include <iostream>using namespace std;class foo {public:    void test(void) {        cout << "test version 1: no arg\n";    };    void test(int arg) {        cout << "test version 2: arg is " << arg << endl;    };};int main(void){    foo f;    f.test();    f.test(100);    return 0;}
程序输出结果是:

[root@localhost overload]# ./a.out 
test version 1: no arg
test version 2: arg is 100


再来一个方法覆盖的例子:

#include <iostream>using namespace std;class foo {public:    void test(void) {        cout << "Base class test method.\n";    };  };class bar : public foo {public:    void test(void) {        cout << "Derived class test method v1.\n";    };      void test(int v) {        cout << "Derived class test method v2.\n";    };  };int main(void){    foo f;    bar b;    f.test();    b.test();    b.test(1);    return 0;}
程序输出结果:

[root@localhost overload]# ./a.out 
Base class test method.
Derived class test method v1.
Derived class test method v2.


最后说虚函数,虚函数相对来说复杂些,先简单介绍下背景。

基类指针或引用可以指向派生类对象,例如当使用基类指针调用派生类覆盖的方法,则会调用基类的实现,而不是派生类的方法,为了调用派生类的方法,也就是说使用实际指向的对象的方法,而不是指针类型对应方法,则可以在基类的方法前加上virtual关键字,使该方法称为一个虚方法,从而使程序在运行时决定调用哪个方法(也就是根据运行时实际对象的类型),例子如下

#include <iostream>using namespace std;class foo {public:    //虚方法    virtual void virtual_m(void) {        cout << "Base class method, virtual version!" << endl;    };    void nonvirtual_m(void) {        cout << "Base class method, nonvirtual version!" << endl;    };};class bar: public foo {public:    void virtual_m(void) {    //void virtual_m(void) const { //加了const在某些c++实现上可能导致基类virtal无效        cout << "Derived class method, virtual!" << endl;    };    void nonvirtual_m(void) {        cout << "Derived class method, nonvirtual!" << endl;    };};int main(void){    foo f;    bar b;    cout << "=============================\n";    f.virtual_m();    f.nonvirtual_m();    cout << "=============================\n";    b.virtual_m();    b.nonvirtual_m();    cout << "=============================\n";    //基类指针指向派生类对象    foo *a = &b;    a->virtual_m();     //将调用派生类方法    a->nonvirtual_m();  //将调用基类方法    return 0;}

程序输出,注意颜色特殊的输出,就是调用了实际对象类型的方法:

[root@localhost 1]# ./a.out 
=============================
Base class method, virtual version!
Base class method, nonvirtual version!
=============================
Derived class method, virtual!
Derived class method, nonvirtual!
=============================
Derived class method, virtual!
Base class method, nonvirtual version!

0 0
原创粉丝点击