- 只有公用派生类才是**基类真正的子类型**,它完整地继承了基类的功能。
基类与派生类对象之间有**赋值兼容关系**,在用到基类对象的时候可以用其子类对象代替。
可以用**公用派生类对象对其基类对象**赋值
A a1; //定义基类A对象a1B b1; //定义类A的公用派生类B的对象b1a1=b1;//用派生类B对象b1对基类对象a1赋值
- 只能用**子类对象对其基类对象赋值,而不能用基类对象对其子类对象赋值**。
- 同一基类的**不同派生类对象之间也不能赋值**。
派生类对象可以替代基类对象**,向基类对象的引用进行赋值或初始化。 **
A a1; //定义基类A对象a1 B b1;//定义类A的公用派生类B的对象b1A &r=b1;//用基类A对象的引用变量r,并用派生类对象b1对其进行初始化
如果函数的参数是基类对象或基类对象的引用,相应的**实参可以用子类对象**。
void fun(A& r){ cout<<r.num<<endl}fun(b1);
派生类对象的地址可以赋给指向基类对象的指针变量,也就是说,**指向基类对象的指针变量也可以指向派生类对象**。
**
- 通过指向基类对象的指针,只能访问派生类中的基类成员,而**不能访问派生类增加的成员**。
- 例:定义一个基类Student(学生),再定义Student类的公用派生类Graduate(研究生),用指向基类对象的指针输出数据。
#include <iostream>#include <string>using namespace std;class Student //声明Student类{public:Student(int, string,float); //声明构造函数void display( ); //声明输出函数private:int num;string name;float score;};Student::Student(int n, string nam,float s) //定义构造函数{num=n;name=nam;score=s;}void Student::display( ) //定义输出函数{cout<<endl<<″num:″<<num<<endl;cout<<″name:″<<name<<endl;cout<<″score:″<<score<<endl;}class Graduate:public Student //声明公用派生类Graduate{public:Graduate(int, string ,float,float); //声明构造函数void display( ); //声明输出函数private:float pay; //工资};Graduate::Graduate(int n, string nam,float s,float p):Student(n,nam,s),pay(p){ }void Graduate::display() //定义输出函数{Student::display(); //调用Student类的display函数cout<<″pay=″<<pay<<endl;}int main(){Student stud1(1001,″Li″,87.5);Graduate grad1(2001,″Wang″,98.5,563.5);Student *pt=&stud1;//定义指向Student类对象的指针并指向stud1pt->display( ); //调用stud1.display函数pt=&grad1; //指针指向grad1 pt->display( ); //调用grad1.display函数}
- 例:定义一个基类Student(学生),再定义Student类的公用派生类Graduate(研究生),用指向基类对象的指针输出数据。
