时间:2022-06-17 08:35:33 | 栏目:C代码 | 点击:次
在类的继承过程中,子类继承了父类除去构造函数和析构函数外的所有成员,那么父类的功能子类是不是都有呢?
实际上,子类是否含有父类的全部功能,取决于“继承方式”。在共有(public)继承的情况下,父类的public
成员在子类中是public
成员,父类的protected
成员在子类中是protected
成员。也就是说,此时,父类对外暴露的功能,子类都有。
因此,在共有继承时,任何需要父类对象的地方,都能使用子类对象“替代”,这就是类型兼容规则。
其中“替代”包含下面三种情况:
下面定义的三个函数,分别对应上述三种情况。其中Animal
为父类,Duck为子类,Animal和Duck都定义了public
类型的eat()
函数:
// 子类对象隐含转换为父类对象; void situationOne(Animal animal) { animal.eat(); } // 子类对象用于初始化父类引用 void situationTwo(Animal &r) { r.eat(); } // 子类指针隐含转换为父类指针 void situationThree(Animal *p) { p->eat(); }
现在,可以使用子类对象作为函数参数传入到上述三个函数中:
Duck duck; situationOne(duck); situationTwo(duck); situationThree(&duck);
注意:三个函数中通过父类调用的eat()函数永远是“父类成员函数eat()”而不是“子类成员函数eat()”。也就是说,通过“类型兼容规则”访问的永远是父类成员,而不是子类成员。