- 只有公用派生类才是**基类真正的子类型**,它完整地继承了基类的功能。
基类与派生类对象之间有**赋值兼容关系**,在用到基类对象的时候可以用其子类对象代替。
可以用**公用派生类对象对其基类对象**赋值
A a1; //定义基类A对象a1
B b1; //定义类A的公用派生类B的对象b1
a1=b1;//用派生类B对象b1对基类对象a1赋值
- 只能用**子类对象对其基类对象赋值,而不能用基类对象对其子类对象赋值**。
- 同一基类的**不同派生类对象之间也不能赋值**。
派生类对象可以替代基类对象**,向基类对象的引用进行赋值或初始化。 **
A a1; //定义基类A对象
a1 B b1;//定义类A的公用派生类B的对象b1
A &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类对象的指针并指向stud1
pt->display( ); //调用stud1.display函数
pt=&grad1; //指针指向
grad1 pt->display( ); //调用grad1.display函数
}
- 例:定义一个基类Student(学生),再定义Student类的公用派生类Graduate(研究生),用指向基类对象的指针输出数据。