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

C++虚函数和多态性的关系【virtual】之二

2012-05-14 17:01 211 查看
C++虚函数和多态性的关系【virtual】之二

在我上一篇的文章中,我把我对虚函数和多态性的关系发表了出来,经过这些天的思考、探讨和查资料,现在我有了更深一层的理解,现记录在此,如大家有更好的理解,也请大家不吝赐教【我上一篇博文的地址是:C++虚函数和多态性的关系【virtual】之一

在上一篇的博文中,我说:如果没有虚函数【也就是virtual声明的函数】,那么C++的多态性就无法解释了,所以说,虚函数使C++具有了多态性!

经过这些天的探讨,在此表示这句话是有点问题的。首先,多态性的有无,和虚函数没有必然的联系,我们只能说,在基类里声明虚函数,这只是多态性的表现形式。【有关虚函数的探讨,我将在后面另写一篇文章】
下面,我们要先理解多态性的概念:不同的对象收到同一消息可以进行不同的响应,产生完成不同的结果。
好,下面我先上代码:

[cpp]
view plaincopyprint?

#include <iostream>

using namespace std;

class Base
{
public:
virtual void test()
{
cout<<"Base"<<endl;
//printf("Base\n");

}
protected:
private:
};

class A:public Base
{
public:
void test()
{
cout<<"Base--A"<<endl;
//__super::test();

}
protected:
private:
};

class B:public Base
{
public:
void test()
{
cout<<"Base--B\n"<<endl;
}
protected:
private:
};
void funcall(Base* base)
{
base->test();
}
int main()
{
Base* base = new Base();
funcall(base); //Base

base = new A();
funcall(base); //A

base = new B();
funcall(base); //B

return 0;
}

#include <iostream>
using namespace std;

class Base
{
public:
virtual void test()
{
cout<<"Base"<<endl;
//printf("Base\n");
}
protected:
private:
};

class A:public Base
{
public:
void test()
{
cout<<"Base--A"<<endl;
//__super::test();
}
protected:
private:
};

class B:public Base
{
public:
void test()
{
cout<<"Base--B\n"<<endl;
}
protected:
private:
};
void funcall(Base* base)
{
base->test();
}
int main()
{
Base* base = new Base();
funcall(base); //Base

base = new A();
funcall(base); //A

base = new B();
funcall(base); //B
return 0;
}

其输出的结果是:



class Base 是基类,class A 和class B继承与class Base。这三个就是不同的对象,当三个不同的对象接收到同一个消息是:test(),其做出了不同的响应,这就是函数的多态性。

其实,我感觉用现实的事物做比喻这就更加形象:不同的哺乳动物有不同的呼吸方式,但是不管怎么样,我们先把呼吸这个抽象的概念放在一个基类里面,然后我们再将其具体化,猫和狗的呼吸方式,就是两种多态性的表现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: