在类的继承过程中,子类继承了父类除去构造函数和析构函数外的所有成员,那么父类的功能子类是不是都有呢?
实际上,子类是否含有父类的全部功能,取决于“继承方式”。在共有(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()”。也就是说,通过“类型兼容规则”访问的永远是父类成员,而不是子类成员。
到此这篇关于C++类型兼容规则详情的文章就介绍到这了,更多相关C++类型兼容内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!