您的位置:首页 > 编程语言 > C语言/C++

c++ 覆盖 隐藏以及一些继承的关系

2016-07-13 13:45 253 查看
通过一个案例来说明,之后是总结

代码如下

头文件:

#include<iostream>

using namespace std;

class CShape

{
protected:
double m_x,m_y,m_z,m_area;
public:
virtual void show();
CShape(double x,double y,double z);

};

class CCircle:public CShape

{
protected:
double m_radius;
public:
CCircle(double x,double y,double z,double r);
void show();

};

类的实现文件:

#include"CShape.h"

CShape::CShape(double x,double y,double z):m_x(x),m_y(y),m_z(z){

}

void CShape::show()

{
cout<<"("<<m_x<<","<<m_y<<","<<m_z<<")"<<endl;

}

CCircle::CCircle(double x,double y,double z,double r):CShape(x,y,z)

{
m_radius=r;

}

void CCircle::show()

{
cout<<"圆的半径:"<<m_radius<<"("<<m_x<<","<<m_y<<","<<m_z<<")"<<endl;

}

mian.cpp

#include <iostream>

#include"CShape.h" 

using namespace std; 

int main(int argc, char** argv) {
void func(CShape &p);
CShape  CS(1,2,6);
cout<<"基类对象.成员函数  此方法调用函数不具有虚特性!!!CS.show()"<<endl; 
CS.show();
CCircle
CC(1.3,66.3,67.5,3.56);
cout<<"派生类对象.成员函数 此方法调用函数不具有虚特性!!!CC.show()"<<endl;
CC.show();
cout<<"通过
 对象名.基类名::数据 可以调用被覆盖的函数或者变量"<<endl;
CC.CShape::show();
CShape  *p=&CS;
cout<<"下面是通过基类的指针实现动态联编"<<endl; 
cout<<"通过基类的指针调用基类的函数p->show()"<<endl;
p->show();
p=&CC;
cout<<"当基类的show()函数是虚函数(virtual)时,基类的同名函数与派生类的成员函数之间形成覆盖的关系,通过基类的指针可以调用派生类的show()函数。否则的话是调用的只是基类的show()函数!!基类的同名函数与派生类的成员函数之间形成隐藏的关系"<<endl;
p->show();

cout<<"下面是通过基类的引用来调用派生类对象的同名函数,实现动态联编!!"<<endl; 
cout<<"通过基类的引用调用基类的函数!!"<<endl;
func(CS);
func(CC); 
return 0;

}

void func(CShape &p)

{
p.show();

}

下面写出一些总结:

1:当派生类重新定义了在基类中定义的同名函数,此时在派生类中的该同名函数隐藏了从基类继承而来的同名函数,此时在派生类域内调用该同名函数只能调用派生类的该同名函数。隐藏一词可以这么理解:在调用一个类的成员函数的时候,编译器会沿着类的继承链逐级的向上查找函数的定
义,如果找到了那么就停止查找了,所以如果一个派生类和一个基类都有同一个同名(暂且不论参数是否相同)的函数,而编译器最终选择了在派生类中的函数,那 么我们就说这个派生类的成员函数"隐藏"了基类的成员函数,也就是说它阻止了编译器继续向上查找函数的定义。----只要是从基类继承来的的同名函数就会被隐藏。

隐藏的定义:

隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下: 
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。 
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。

2.对于上面出现这些问题的函数该怎么调用???

  (1)被隐藏函数的调用:

当派生类重新定义了在基类中定义的同名函数时,在类的外部可以通过  “对象名.基类名::函数”  的方法来调用。在类的内部可以通过  “基类名::函数”的方式来调用。

(2)隐藏函数的调用:

在类外直接可以用 派生类的对象.函数  的方法来直接调用。

3.虚函数是怎么回事??有啥卵用??

(1)说到虚函数,在这我先引出覆盖的两个条件:

(a)派生类的函数与基类的函数同名,并且参数也相同

(b)[b]基类函数必须是虚函数[/b]

(2)虚函数的作用

术语:实现多态性(Polymorphism)

通俗点讲:

可以让成员函数操作一般化,用基类的指针指向不同的派生类的对象时, 
基类指针调用其虚成员函数,则会调用其真正指向对象的成员函数, 
而不是基类中定义的成员函数(只要派生类改写了该成员函数)。 
若不是虚函数,则不管基类指针指向的哪个派生类对象,调用时都 
会调用基类中定义的那个函数

(3)虚函数的使用

只有通过基类的指针或引用才能实现其虚特性!!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++基础知识