1122通过基类指针调用同名函数 ◆以下这些操作是不可以进行的: 不可以将基类对象赋值给派生类对象; ■不可以用基类对象的地址初始化派生类对象的 指针; 不可以将派生类对象的引用定义为基类对象的 别名; 不可以通过用派生类对象初始化的基类对象的 指针,访问派生类新增加的和基类公有成员不 重名的公有成员。 2021/2/24
2021/2/24 -21- 11.2.2通过基类指针调用同名函数 以下这些操作是不可以进行的: ◼ 不可以将基类对象赋值给派生类对象; ◼ 不可以用基类对象的地址初始化派生类对象的 指针; ◼ 不可以将派生类对象的引用定义为基类对象的 别名; ◼ 不可以通过用派生类对象初始化的基类对象的 指针,访问派生类新增加的和基类公有成员不 重名的公有成员
◆例11.2在例11.所定义的类的基础上,观察通过派生类对象地址初 始化的基类对象的指针访问 getArea函数的结果。 include <iostream> circle对象初始化 shape ptr指针 using namespace std; 访问的 getArea函数是 iNclude"shape. h 基类的 getAreal函数,面积是0 void maino rectangle对象初始化 shape_ptr I Shape *shape_ ptr; 指针访问的 getArea函数是 Circle circle( 22, 8, 3.5) 基类的 getArea函数,面积是0 Rectangle rectangle(10,10);∥创建 Rectangle类对象 shape_ ptr= &circle; ∥ Circle类对象地址初始化基类指针 cout<<" circle对象初始化 shape_ptr指针访问的 getArea函数是 <<end: cout< shape_ptr-> getArea()<<endl;∥静态联编 shape_ptr=& rectangle;∥ Rectangle类对象地址初始化基类指针 cout<<" rectangle对象初始化 shape ptr指针访问的 getArea函数 是"<<endl; cout<< shape_ptr- getArea0)<<endl;静态联编 ∥结束main函数 2021/2/24
2021/2/24 -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通过基类指针调用同名函数 ◆程序运行结果表明 确实可以用派生类对象的地址初始化基类对象的指 针 通过用派生类对象地址初始化的基类对象指针,只 能调用基类的公有成员函数。在以上例子中,就是 调用基类的 getArea函数,而不是派生类的 getArea函数。 这种调用关系的确定,也是在编译的过程中完成的, 属于静态联编,而不属于运行时的多态。 2021/2/24
2021/2/24 -23- 11.2.2通过基类指针调用同名函数 程序运行结果表明: ◼ 确实可以用派生类对象的地址初始化基类对象的指 针; ◼ 通过用派生类对象地址初始化的基类对象指针,只 能调用基类的公有成员函数。在以上例子中,就是 调用基类的getArea函数,而不是派生类的 getArea函数。 ◼ 这种调用关系的确定,也是在编译的过程中完成的, 属于静态联编,而不属于运行时的多态
11.3虚函数和远行时的多庵 2021/224
2021/2/24 24 11.3 虚函数和运行时的多态
赋值兼容原则 生类成员 个公有派生类的对象在使用上可以被当作基 类的对象,反之则禁止。具体表现在 派生类的对象可以被赋值给基类对象。 的·派生类的对象可以初始化基类的引用 标识与 指向基类的指针也可以指向派生类。 7万 2021/2/24
2021/2/24 -25- 赋值兼容原则 一个公有派生类的对象在使用上可以被当作基 类的对象,反之则禁止。具体表现在: ◼ 派生类的对象可以被赋值给基类对象。 ◼ 派生类的对象可以初始化基类的引用。 ◼ 指向基类的指针也可以指向派生类。 派 生 类 成 员 的 标 识 与 访 问