1122通过基类指针调用同名函数 ◆以下这些操作是不可以进行的: ■不可以将基类对象赋值给派生类对象; 不可以用基类对象的地址初始化派生类对象的 指针; ■不可以将派生类对象的引用定义为基类对象的 别名; ■不可以通过用派生类对象初始化的基类对象的 指针,访问派生类新增加的和基类公有成员不 重名的公有成员 2005-4-28 北京邮电大学电信工程学院计算机技术中心
2005-4-28 北京邮电大学电信工程学院计算机技术中心 -21- 11.2.2通过基类指针调用同名函数 以下这些操作是不可以进行的: 不可以将基类对象赋值给派生类对象; 不可以用基类对象的地址初始化派生类对象的 指针; 不可以将派生类对象的引用定义为基类对象的 别名; 不可以通过用派生类对象初始化的基类对象的 指针,访问派生类新增加的和基类公有成员不 重名的公有成员
◆例11.2在例11.1所定义的类的基础上,观察通过派生类对象地址初 始化的基类对象的指针访问 getArea函数的结果。 #include < iostream> circle 对象初始化 shape ptr指 using namespace std 针访问的 getArea函数是 #include" shape. h 基类的 getArea函数,面积是0 void maino rectangle对象初始化 shape ptr I Shape *shape ptr 指针访问的 getArea函数是 Circle circle(228,3.5);[基类的 IgetArea函数,面积是0 Circle类对象 Rectangle rectangle(10,10);//创建 Rectangle类对象 shape ptr =&circle // Circle类对象地址初 始化基类指针 cout<" circle对象初始化 shape_ptr指针访问的 getArea函数是 Kendl cout( shape ptr> getArea0<endl;//静态联编 shape ptr=& rectangle;// Rectangle类对象地址初始化基类 指针 cout<" rectangle对象初始化 shape ptr指针访问的 getArea函数 是"<<end1 2005-4-28 北京邮电大学电信工程学院计算机技术中 K< end cout<shape ptr->getAreao< /静态联编
2005-4-28 北京邮电大学电信工程学院计算机技术中心 -22- 例11.2 在例11.1所定义的类的基础上,观察通过派生类对象地址初 始化的基类对象的指针访问getArea函数的结果。 #include <iostream> using namespace std; #include "shape.h" // 包含头文件 void main() { Shape *shape_ptr; // 指向基类对象的指针 Circle circle( 22, 8, 3.5 ); // 创 建 Circle类对象 Rectangle rectangle( 10, 10 ); // 创建Rectangle类对象 shape_ptr = &circle; // Circle类对象地址初 始化基类指针 cout << "circle 对象初始化shape_ptr指针访问的getArea函数是 "<<endl; cout<<shape_ptr->getArea() << endl; // 静态联编 shape_ptr = &rectangle; // Rectangle类对象地址初始化基类 指针 cout << "rectangle 对象初始化shape_ptr指针访问的getArea函数 是 "<<endl; cout<<shape_ptr->getArea() << endl; // 静态联编 } // 结束main函数 circle 对象初始化 shape_ptr指 针访问的getArea函数是 基类的getArea函数,面积是 0 rectangle 对象初始化shape_ptr 指针访问的getArea函数是 基类的getArea函数,面积是 0
1122通过基类指针调用同名函数 ◆程序运行结果表明: n确实可以用派生类对象的地址初始化基类对象的指 针 通过用派生类对象地址初始化的基类对象指针,只 能调用基类的公有成员函数。在以上例子中,就是 调用基类的 getArea函数,而不是派生类的 getArea 函数 ■这种调用关系的确定,也是在编译的过程中完成 的,属于静态联编,而不属于运行时的多态 2005-4-28 北京邮电大学电信工程学院计算机技术中心
2005-4-28 北京邮电大学电信工程学院计算机技术中心 -23- 11.2.2通过基类指针调用同名函数 程序运行结果表明: 确实可以用派生类对象的地址初始化基类对象的指 针; 通过用派生类对象地址初始化的基类对象指针,只 能调用基类的公有成员函数。在以上例子中,就是 调用基类的getArea函数,而不是派生类的getArea 函数。 这种调用关系的确定,也是在编译的过程中完成 的,属于静态联编,而不属于运行时的多态
1122通过基类指针调用同名函数 ◆程序运行结果表明: n确实可以用派生类对象的地址初始化基类对象的指 针 通过用派生类对象地址初始化的基类对象指针,只 能调用基类的公有成员函数。在以上例子中,就是 调用基类的 getArea函数,而不是派生类的 getArea 函数 ■这种调用关系的确定,也是在编译的过程中完成 的,属于静态联编,而不属于运行时的多态 2005-4-28 北京邮电大学电信工程学院计算机技术中心 24
2005-4-28 北京邮电大学电信工程学院计算机技术中心 -24- 11.2.2通过基类指针调用同名函数 程序运行结果表明: 确实可以用派生类对象的地址初始化基类对象的指 针; 通过用派生类对象地址初始化的基类对象指针,只 能调用基类的公有成员函数。在以上例子中,就是 调用基类的getArea函数,而不是派生类的getArea 函数。 这种调用关系的确定,也是在编译的过程中完成 的,属于静态联编,而不属于运行时的多态
11.3虛函数和远行时的多态
11.3 虚函数和运行时的多态