• 只有公用派生类才是**基类真正的子类型**,它完整地继承了基类的功能。
    • 基类与派生类对象之间有**赋值兼容关系**,在用到基类对象的时候可以用其子类对象代替。

      • 可以用**公用派生类对象对其基类对象**赋值

        1. A a1; //定义基类A对象a1
        2. B b1; //定义类A的公用派生类B的对象b1
        3. a1=b1;//用派生类B对象b1对基类对象a1赋值
        • 只能用**子类对象对其基类对象赋值,而不能用基类对象对其子类对象赋值**。
        • 同一基类的**不同派生类对象之间也不能赋值**。
      • 派生类对象可以替代基类对象**,向基类对象的引用进行赋值或初始化。 **

        1. A a1; //定义基类A对象
        2. a1 B b1;//定义类A的公用派生类B的对象b1
        3. A &r=b1;//用基类A对象的引用变量r,并用派生类对象b1对其进行初始化
      • 如果函数的参数是基类对象或基类对象的引用,相应的**实参可以用子类对象**。

        1. void fun(A& r)
        2. { cout<<r.num<<endl}
        3. fun(b1);
      • 派生类对象的地址可以赋给指向基类对象的指针变量,也就是说,**指向基类对象的指针变量也可以指向派生类对象**。

    **

    • 通过指向基类对象的指针,只能访问派生类中的基类成员,而**不能访问派生类增加的成员**。
      • 例:定义一个基类Student(学生),再定义Student类的公用派生类Graduate(研究生),用指向基类对象的指针输出数据。
        1. #include <iostream>
        2. #include <string>
        3. using namespace std;
        4. class Student //声明Student类
        5. {public:
        6. Student(int, string,float); //声明构造函数
        7. void display( ); //声明输出函数
        8. private:
        9. int num;
        10. string name;
        11. float score;
        12. };
        13. Student::Student(int n, string nam,float s) //定义构造函数
        14. {
        15. num=n;
        16. name=nam;
        17. score=s;
        18. }
        19. void Student::display( ) //定义输出函数
        20. {
        21. cout<<endl<<″num:″<<num<<endl;
        22. cout<<″name:″<<name<<endl;
        23. cout<<″score:″<<score<<endl;
        24. }
        25. class Graduate:public Student //声明公用派生类Graduate
        26. {public:
        27. Graduate(int, string ,float,float); //声明构造函数
        28. void display( ); //声明输出函数
        29. private:
        30. float pay; //工资
        31. };
        32. Graduate::Graduate(int n, string nam,float s,float p)
        33. :Student(n,nam,s),pay(p){ }
        34. void Graduate::display() //定义输出函数
        35. {
        36. Student::display(); //调用Student类的display函数
        37. cout<<″pay=″<<pay<<endl;
        38. }
        39. int main()
        40. {Student stud1(1001,″Li″,87.5);
        41. Graduate grad1(2001,″Wang″,98.5,563.5);
        42. Student *pt=&stud1;//定义指向Student类对象的指针并指向stud1
        43. pt->display( ); //调用stud1.display函数
        44. pt=&grad1; //指针指向
        45. grad1 pt->display( ); //调用grad1.display函数
        46. }