2015-12-11 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
关注
展开全部
多态(Polymorphism)按字面的意思就是"多种状态"。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述--多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自"Delphi4 编程技术内幕")。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数(Virtual Function) 实现的。
多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
C++中,实现多态有以下方法:虚函数,抽象类,重载,覆盖,模版。
多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
C++中,实现多态有以下方法:虚函数,抽象类,重载,覆盖,模版。
展开全部
自己写的一个虚函数的例子
#include "stdafx.h"
#include <string>
#include <iostream>
class CBase
{
public:
void who()
{
std::cout << "I'm Base class!" << std::endl;
}
virtual void whoEx()
{
std::cout << "I'm Base class!" << std::endl;
}
};
class CSubA : public CBase
{
public:
void who()
{
std::cout << "I'm sub class A!" << std::endl;
}
virtual void whoEx()
{
std::cout << "I'm sub class A!" << std::endl;
}
};
class CSubB : public CBase
{
public:
void who()
{
std::cout << "I'm sub class B!" << std::endl;
}
virtual void whoEx()
{
std::cout << "I'm sub class B!" << std::endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
CBase *pObj;
CBase objBase;
CSubA objSubA;
CSubB objSubB;
std::cout << "directly access method of class ----------------------------------------------" << std::endl;
objBase.who();
objSubA.who();
objSubB.who();
std::cout << "accessing normal method of class by pointer ----------------------------------" << std::endl;
pObj = &objBase;
pObj->who();
pObj = &objSubA;
pObj->who();
pObj = &objSubB;
pObj->who();
std::cout << "accessing virtual method of class by pointer ---------------------------------" << std::endl;
pObj = &objBase;
pObj->whoEx();
pObj = &objSubA;
pObj->whoEx();
pObj = &objSubB;
pObj->whoEx();
std::cout << "accessing virtual method of class by refrence ---------------------------------" << std::endl;
CBase& base = objBase;
base.whoEx();
CBase& baseA = objSubA;
baseA.whoEx();
CBase& baseB = objSubB;
baseB.whoEx();
return 0;
}
程序输出:
directly access method of class ----------------------------------------------
I'm Base class!
I'm sub class A!
I'm sub class B!
accessing normal method of class by pointer ----------------------------------
I'm Base class!
I'm Base class!
I'm Base class!
accessing virtual method of class by pointer ---------------------------------
I'm Base class!
I'm sub class A!
I'm sub class B!
accessing virtual method of class by refrence ---------------------------------
I'm Base class!
I'm sub class A!
I'm sub class B!
请按任意键继续. . .
成员函数的重载,覆盖(改写)和隐藏
成员函数被重载的特征是:
1、具有相同的作用域,即在同一个类申明中。
2、返回值相同,函数的参数不同。
3、同名const方法和非const方法之间的重载不受到2的约束,同类重载受到2的约束。
4、不需要virutal 关键字。
覆盖(也叫做多态)或者改写是指派生类重新实现或者改写了基类的成员函数,其特征是:
1、不同的作用域(分别位于派生类和基类中)。
2、函数名称相同。
3、函数的参数也完全相同。
4、基类必须有virtual关键字,子类则可有可无。
5、若虚函数存在重载的情况,遵循基类而不遵循子类。
6、构造函数中虚函数无效,总是调用本类型方法不会调用覆盖方法。
隐藏
1、不同的作用域(分别位于派生类和基类)。
2、函数名称相同。
3、函数的参数不要求相同。
4、不需要virtual关键字。
5、总是调用引用类型对应的方法。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
父类的引用或指针来操作子类的对象。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。
实现多态,可以通过接口,也可以通过重写基类的虚方法。
实际多态后,可以通过对父类对象的方法调用实现每一个不同子类的各自的不同行为。
比如一个可以定义一个画图的基类(Sharp),有一个虚方法Draw;
定义矩形、圆、椭圆等为它的子类,在每一个子类中重写Draw方法以实现自己的呈现方式。这样在通过父类的Draw的调用,就可以实现每一个图形自己的不同外观。
实现多态,可以通过接口,也可以通过重写基类的虚方法。
实际多态后,可以通过对父类对象的方法调用实现每一个不同子类的各自的不同行为。
比如一个可以定义一个画图的基类(Sharp),有一个虚方法Draw;
定义矩形、圆、椭圆等为它的子类,在每一个子类中重写Draw方法以实现自己的呈现方式。这样在通过父类的Draw的调用,就可以实现每一个图形自己的不同外观。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询