本文主要是介绍派生类规则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
派生类:1. 声明为指向基类对象的指针可以指向它的公有派生的对象,但不允许指向它的私有派生的对象
class base{
//function
}
class derive:private base{
//function
}
void main(){
base op1,*ptr;
derive op2;
ptr = &op1;
prt = &op2; //错误,不允许将base类的指针指向它私有继承的派生类对象op2
}
2.允许将一个声明为指向基类的指针指向其公有派生类的对象,但是不能将一个声明为指向派生类的对象的指针指向其基类的对象。
3.声明为指向基类对象的指针,当其指向公有派生类对象时,只能用它来直接访问派生类中从基类继承过来的成员,而不能直接访问公有派生类中定义的成员。
class A{
public:
void print1(){
}
}
class B:public A{
public:
void print2(){
}
}
void main(){
A op1,*ptr;
B op2;
ptr=&op1;
ptr->print1();
ptr=&op2;
prt->print1();
ptr->print2(); //错误,基类指针ptr不能访问派生类中定义的成员函数print2()
}
若想访问其公有派生类的特定成员,有两种方法
1. 可以将基类指针用显式类型强制转换为派生类指针(静态的方式,因为这些都是调用在编译时静态联编)
((B*)ptr)->print2();
2. 虚函数或者纯虚函数 (指针指向不同对象时执行不同的操作,)
虚函数: 是在 “基类” 中定义的,
virtual 函数类型 函数名(形参表){
//函数体
}
函数体也可以为 空 ,此虚函数就可以在一个或多个派生类中被重新定义,重新定义只是函数体可以重新定义,而返回类型、函数名、参数个数、参数类型的顺序都必须与基类中的原型完全相同。
虚函数说明:
1.基类中,用关键字virtual可以将public或protected部分的成员函数声明为虚函数,private函数不可以
2.派生类中,对基类继承的虚函数进行重新定义时,关键字virtual可写可不写
如果不写,系统会检测:
该函数与基类的虚函数有相同的名称
该函数与基类的虚函数有相同的参数个数及相同的对应参数类型
该函数与基类的虚函数有相同的返回类型或者满足赋值兼容规则的指针、引用类型的返回类型
来判断是否还有虚函数的特性
3.虚函数被重新定义时,其函数的原型与基类中的函数原型必须完全相同
4.通过对象名和点运算符的方式也可以调用虚函数,但这种调用时在编译时进行的动态联编,它没有充分利用虚函数的特性,只有通过基类指针访问虚函数时才能获得运行时的多态性。
5.虚函数必须是其所在类的成员函数,不能使友元函数,也不能是静态成员函数,因为虚函数调用需要靠特定的对象来决定该激活哪个函数。但是虚函数可以在另一个类中被声明为友元函数。
6.构造函数不能是虚函数,但析构函数可以是虚函数。
多态:实现了在基类定义派生类所拥有的通用接口,而在派生类定义具体的实现方法,即常说的“同一接口,多种方法”。
这篇关于派生类规则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!