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(),其做出了不同的响应,这就是函数的多态性。
其实,我感觉用现实的事物做比喻这就更加形象:不同的哺乳动物有不同的呼吸方式,但是不管怎么样,我们先把呼吸这个抽象的概念放在一个基类里面,然后我们再将其具体化,猫和狗的呼吸方式,就是两种多态性的表现。
在我上一篇的文章中,我把我对虚函数和多态性的关系发表了出来,经过这些天的思考、探讨和查资料,现在我有了更深一层的理解,现记录在此,如大家有更好的理解,也请大家不吝赐教【我上一篇博文的地址是: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(),其做出了不同的响应,这就是函数的多态性。
其实,我感觉用现实的事物做比喻这就更加形象:不同的哺乳动物有不同的呼吸方式,但是不管怎么样,我们先把呼吸这个抽象的概念放在一个基类里面,然后我们再将其具体化,猫和狗的呼吸方式,就是两种多态性的表现。
相关文章推荐
- C++虚函数和多态性的关系【virtual】之一
- C++(不用virtual)模拟虚函数来表现出多态性
- C++虚函数和多态性的关系【virtual】之二
- C++的虚基类,抽象类,虚函数,纯虚函数,virtual
- C++中virtual(虚函数)的用法详解
- 2013级C++第14周(春)项目——多态性、虚函数和抽象类
- C++中的虚函数(virtual )
- c++ 继承 多重继承 多态性 虚函数
- C++ 学习之路(11):多态性与虚函数
- C++中的虚函数(virtual function)
- C++之多态性与虚函数
- c++新手学习笔记之多态性和虚函数(1)
- c++多态性与虚函数(一)
- C++之多态性与虚函数
- c++--多态性与虚函数
- C++的多态性只能通过virtual关键字实现
- C++学习笔记――多态性和虚函数
- C++的虚基类,抽象类,虚函数,纯虚函数,virtual
- 一步一步学习C++(类)之多态性与虚函数
- C++ 继承,虚函数与多态性专题