C++中的多态(虽然多态不是C++所特有的,但是C++中的多态确实是很特殊的)分为静多态和动多态(也就是静态绑定和动态绑定两种现象),静动的区别主要在于这种绑定发生在编译期还是运行期,发生在编译期的是静态绑定,也就是静多态;发生在运行期的则是动态绑定,也就是动多态。
静多态可以通过模板和函数重载来实现(之所说C++中的多态主要还是因为模板这个东西),下面举两个例子:
1)函数模板
template <typename T>
T max(const T& lsh, const T& rhs)
{
return (lsh > rhs) ? lsh : rhs;
}
返回两个任意类型对象的最大值(对象),前提是该类型能够使用>运算符进行比较,并且返回值是bool类型。
使用:
int a = 3; int b = 4;
cout << max(a, b) << endl;
float c = 2.4; float d = 1.2;
cout << max(c, d) << endl;
输出结果为:
4
2.4
这种绑定发生在编译期,这是由于模板的实例化是发生在编译期的,即在编译时编译器发现你调用max(a, b)时就自动生成一个函数
int max(const int& lsh, const int& rhs)
{
return (lsh > rhs) ? lsh : rhs;
}
即将所有的T替换成int;
当你调用max(c, d)时就自动生成一个函数
float max(const float& lsh, const float& rhs)
{
return (lsh > rhs) ? lsh : rhs;
}
之所以说开始的函数定义是函数模板,就是因为他就像个模子似的,你可以用铝作为原料也可以用石膏或者铜。
2)函数重载:
int max (int a, int b)
{
return (a > b) ? a : b;
}
int max (int a, int b, int c)
{
return max(max(a, b), c);
}
两个函数名称一样,参数类型或个数不完全相同,返回值一样(这个不重要)。
使用:
int a = 3, b = 4, c = 5;
cout << max(a, b) << endl;
cout << max(a, b, c) << endl;
输出结果为:
4
5
确定函数的过程也发生在编译器,当你使用max(a, b),编译器发现只有两个参数,那么就调用只有两个参数的函数版本,当使用max(a, b, c)时,编译器则使用有3个参数的版本。
通过上面的两个例子,你还可以使用更为方便的模板函数重载:
template <typename T>
T max(const T& lsh, const T& rhs)
{
return (lsh > rhs) ? lsh : rhs;
}
template <typename T>
T max(const T& a, const T& b, const T& c)
{
return max(max(a, b), c);
}
使用
float a = 3.6, b = 1.2, c = 7.8;
cout << max(a, b, c) << endl;
输出:
7.8
通过参数个数和类型,编译器自动生成和调用对应得函数版本!
动多态则是通过继承、虚函数(virtual)、指针来实现。
class A {
public:
virtual void func() const {
coust << “A::func()” << endl;
}
}
class B : public A {
public:
virtual void func() const {
coust << “B::func()” << endl;
}
}
使用:
A a* = B();
a->func();
输出:
B::func()
编译期是不调用任何函数的,编译器编译到a->func()时只是检查有没有语法问题,经过检查没有。编译器并不知道调用的是A版本的func()还是B版本的func(),由于a是一个指向B对象的指针,所以a只知道它指向的是一个A类型(或者能转换成A类型)的对象。通常集成体系就说明了(由于是公有继承)B是一种A。在运行期,a要调用a所指向对象的func()函数,就对它指向的对象下达调用func()的命令,结果a所指向的是一个B对象,这个对象就调用了自己版本(B版)的func()函数,所以输出时B::func()
总结:
在编译期决定你应该调用哪个函数的行为是静态绑定(static-binding),这种现象就是静多态。
在运行期决定应该调用哪中类型对象的函数的行为是动态绑定(dynamic-binding),这种现象就是动多态!
注:由于这是我花了有限的时间总结的,语言应用能力比较差,还有比如类模板(静多态和动多态组合的情况)都没有说,最近比较忙,请见谅!
如果还不是很懂,我建议你看C++Primer 4th Edition,讲的比较清晰,但是比较零散!
温馨提示:内容为网友见解,仅供参考
c++中什么是多态!
在C++中接口的多种不同的实现方式就是多态。多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。允许将子类类型的指针赋值给父类类型的指针。多态性在ObjectPascal和C++中都是通过虚函数实现的。赋值之后,父类型...
什么叫做多态性,在c++中是如何实现多态的
C++中的多态(虽然多态不是C++所特有的,但是C++中的多态确实是很特殊的)分为静多态和动多态(也就是静态绑定和动态绑定两种现象),静动的区别主要在于这种绑定发生在编译期还是运行期,发生在编译期的是静态绑定,也就是静多态;发生在运行期的则是动态绑定,也就是动多态。静多态可以通过模板和函数...
什么是多态性,C++中是如何实现多态的
多态按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的...
c++多态性是什么,有什么作用
简单地说就是子类里实现了父类的虚函数,父类的指针不仅可以调用自己的这个函数,同时也可以调用子类的这个虚函数,从而实现了多态。作用就是实现了动态联编,使程序运行效率更高,更容易维护和操作。
c++和java的多态性的区别
多态是指用父指针指向不同子类对象时,调用其共有的函数,不同的子类会有不同的行为。虽然C++和Java都具有多态机制,但是他们的实现不同,使用时的效果也会略有不同 在C++中 普通函数调用:具体调用哪个方法在编译时就可以决定(通过查找编译器的符号表),同时在使用标准过程调用机制基础上增加一个表示...
编程c++是什么
多态性是面向对象编程的关键特性之一。它允许不同类的对象响应相同的消息或方法调用,以不同的方式执行。这种动态行为使C++程序能够以抽象的方式处理不同类型的对象,从而实现代码的通用性和灵活性。从技术角度看,C++是编译型语言。在开发过程中,程序被编译成机器代码,便于高效执行。而为了方便调试和测试...
多态的三种表现形式
多态指同一个实体同时具有多种形式。它是面向对象程序设计(OOP)的一个重要特征。如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的。C++中的多态性具体体现在运行和编译两个方面。运行时多态是动态多态,其具体引用的对象在运行时才能确定。编译时多态是静态多态,在编译时...
在c++中虚函数和多态性是什么意思
多态是指使用相同的函数名来访问函数不同的实现方法,即“一种接口,多种方法”,用相同的形式访问一组通用的运算,每个运算可能对应的行为不同。C++支持编译时多态和运行时多态,运算符重载和函数重载就是编译时多态,而派生类和虚函数实现运行时多态。运行时多态的基础是基类指针,基类指针可以指向任何...
c++ 的特点是什么?c++ 的特点是什么?谈谈它的多态性。
c++ 的特点是什么?谈谈它的多态性。 学了那么多的c++,结果却对基础概念法而不熟了。c++有什么特点?谈谈它的多态性。c++比起java除了速度快以外还有什么优越性?是这样的,我是学过c++的人,也用它做过小项目。可是明天... 学了那么多的c++,结果却对基础概念法而不熟了。c++有什么特点?谈谈它的多态性。c++比...
C++中多态的作用?
c++中多态更容易理解的概念为 允许父类指针或名称来引用子类对象,或对象方法,而实际调用的方法为对象的类类型方法。在C++中: classA{ public: A(){} virtualvoidfo... c++中多态更容易理解的概念为 允许父类指针或名称来引用子类对象,或对象方法,而实际调用的方法为对象的类类型方法。在C++中: class A { ...