您的位置:首页 > 编程语言 > C语言/C++

C++多态性

2015-12-10 14:20 387 查看

多态,英文为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< 4000 /span>

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

#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!

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: