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)虚函数的使用
只有通过基类的指针或引用才能实现其虚特性!!
代码如下
头文件:
#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++输出流cout的
- 为什么c++要引入友元函数?
- c++ 基础知识(输入输出、namespace命名空间、引用、函数重载模版、内存管理)
- C++之string类型详解
- C++的深拷贝与浅拷贝
- C++必备基础知识和编程规范
- C++ std::size_t
- Ring buffer basics 环形缓冲基础(C语言实现) 二
- 1016. 部分A+B (15)
- WTL对话框添加背景图片的方法(C++)
- 1021. 个位数统计 (15)
- 1043. 输出PATest(20)
- c/c++ 变量名前面加井号#
- 1042. 字符统计(20)
- 1012. 数字分类 (20)
- C语言面试之CPU控制
- 1011. A+B和C (15)
- 1009. 说反话 (20)
- 《C++ Primer Plus》第13章 类继承 笔记
- 1006. 换个格式输出整数 (15)