派生类同名处理
隐藏redifine
当我们在派生类中写了一个与基类同名、同参的成员方法时,编译器不会报错,当我们通过派生类定义的对象去访问重名函数时,会访问到派生类的那个函数,这种现象叫做“重定义”有时候也叫“隐藏”,实际上在派生类中两个函数都存在,只是在不同类域名中,新成员方法会隐藏掉旧方法,这个是当然,如果旧方法隐藏新方法,那还要新方法干嘛。
访问被隐藏成员的方法
如果想要访问被隐藏的方法,可以将派生类强制转换成基类的类型,再去调用,编译器会以为是基类在调用,就能访问到,这种方法很少会这么操作,另外一种方法就是在派生类内部,使用作用域符号来指定访问,“父类::方法”的语法可以调用到,示例如下。
void man::get_name(void)
{
cout << name<<endl; //完整是this->name,也可以写man::name
cout << person::name << endl;//只能person::name访问隐藏的name。
spek(); //完整是this-> spek( ); 可以写成man::spek
person::spek(); //访问person中的spek方法
}
在派生类中使用“父类::方法”的语法除了可以指定访问方法的作用域,也可以指定变量的作用域,同样用来解决变量名重名问题。隐藏本质上是大小作用域内同名变量的认领,就像局部变量与全局变量重名后,函数内部访问的是局部变量,也可以说是局部变量隐藏了全局变量,实际上两个变量都存在与内存中。
派生类与基类的兼容规则
在c/c++中long int 兼容int兼容short int,而int与float虽然内存大小相同,但是他们完全不兼容,这就是普通变量的兼容规则。
派生类中包含了基类,所以他们之间有关联,但这个关联不是简单的向普通变量那样的兼容特性,使用cast关键字,可以将派生类对象中部分内容裁剪掉,留下基类的内容,考虑到指针和引用后,派生类和基类的访问规则就是所谓兼容规则。
基类的指针可以访问派生类的变量,如下示例
int main(void)
{
man a; //man类继承了person类,创建一个a对象
person *p = &a; //使用基类person指针指向派生类man的对象a
p->print(); //调用speak
}
不良继承
继承就是为了代码复用,继承方式很适合用来做框架设计,一层层向下剥离,然而继承时