欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++编程入门--多态性

程序员文章站 2022-04-22 11:32:22
...

在C++中,对于多态性,一个要解决的主要问题就是如何把具体的操作和对象进行绑定(binding),也称联编,关联,绑定指得是程序如何为类的对象找到执行操作函数的程序入口的过程。。从系统实现的角度来看,多态可以分为编译时多态运行时多态
本篇主要讲编译时的多态:在程序编译过程中时决定同名操作与对象的绑定关系,也称静态绑定、静态联编,典型的技术有函数重载、运算符重载、模板。 由于这种方式是在程序运行前就确定了对象要调用的具体函数,因此程序运行的时候函数调用速度快、效率高。其缺点就是编程不够灵活。
下面来看这段程序:

//created by kong at 2019-10-21
#include<iostream>
using namespace std;
class Base{
public:
	void Print(){
		cout << "Base Class Print." << endl;
	}
};
class Derived :public Base{
public:
	void Print(){
		cout << "Derived Class Print." << endl;
	}
};
int main(){
	Base b1, *pb;
	Derived d1;
	b1.Print();
	d1.Print();
	d1.Base::Print();
	pb = &b1;
	pb->Print();
	pb = &d1;          //希望调用派生类对象d1的Print()成员函数
	pb->Print();		//系统认为指针pb仍被认为指向一个基类对象,自动调用派生类中继承自基类的成员函数Print().
	return 0;
}

程序运行结果为:
C++编程入门--多态性
按照我们的设想,我们所希望的运行结果应该是这样:
Base Class Print.
Derived Class Print.
Base Class Print.
Base Class Print.
Derived Class Print.
我们来看下这段程序,我么在程序中定义了一个基类指针pb,当把这个指针指向派生类的对象时,希望调用派生类对象d1的Print()函数,但却仍然调用了d1对象包含的基类成员函数Print()。
在C++中,虽然基类指针pb可以指向其派生类对象d1,但指针的属性并未改变,系统认为他仍然是一个基类对象,于是就调用了派生类中的继承自基类的成员函数Print()。这是由于静态绑定的原因,编译器不知道积累指针所指向的对象重新定义了同名的Print()函数,仍然把d1内部包含的基类对象和Print()函数绑在一起,就造成了以上的运行结果。
所以,尽管在派生类Derived中新定义了Print()函数,但是想要通过一个基类的指针达到调用这个函数的目的是不行的,要解决这个问题,必须通过动态绑定技术,使得程序在执行时确定所要调用的函数,要实现动态绑定,方法就是把在派生类中重写的函数声明为虚函数。 在另一篇博文见。