重载、覆盖和隐藏

 部分文字内容摘自《高质量C++/C编程》

 链接:http://man.chinaunix.net/develop/c&c++/c/c.htm#_Toc520634042


 1 重载 Overload

 1) 相同的范围,在同一个类中。

 2) 函数名相同,参数不同。

 3) virtual可有可无。

 这在平时设计中用的比较多,比如游戏中角色说话,可以设计成: 

 void SendDialog(const char* content); // 默认

 void SendDialog(const char* content, char color); // 内容颜色

 void SendDialog(const char* content, char effect); // 带特效

 ...

 

 重载对返回值不做限制,可以说,返回值不是能否重载的判断标准。

 如果两个函数仅是返回值不同,则不是重载,会有编译错误。


2 覆盖(重写) Override

1) 不同的范围,分别位于基类和派生类。

2) 函数名相同,参数相同。

3) 基类中带有virtual关键字。

这在平时用的也很多,现在又添加了override关键字,等于派生类告诉基类,我

不使用你提供的方法,我要自己实现。

一个据说很俗,我也没看出哪里俗的例子:

计算面积:

class Shape

{

public:

     virtual float Area(float x, float y) { return 0; }

// ...

}

class Rectangle : public Shape

{

public:

     virtual float Area(float x, float y) { return x * y; }

}

class Triangle : public Shape

{

public:

     virtual float Area(float x, float y) { return (x * y * 0.5); }

}


3 隐藏

1) 派生类中的函数与基类中的函数同名,参数不同,则基类同名函数被隐藏。

2) 派生类中的函数与基类中的函数名相同,参数也相同,基类中没有virtual关键字,基类同名函数被隐藏。

    (如果有带virtual关键字,则为覆盖)

所谓隐藏,换个说法就是不能被调用了。

针对1)的例子:

class Rectangle
{
public:
     void SetWith(double w) { m_width = w; }
     void SetHeight(double h) { m_height = h; }

private:
     double m_width;
     double m_height;
};

class Square : public Rectangle
{
public:
     void SetWith(double w, bool module) 
     { 
          Rectangle::SetWith(w);
          Rectangle::SetHeight(w);
     }

     void SetHeight(double h)
     {
          Rectangle::SetWith(h);
          Rectangle::SetHeight(h);
     }
};

void func()

{

     Square s;

    // 编译都无法通过,因为派生类隐藏了基类的SetWith,

    // 无法调用基类SetWith函数。

     s.SetWith(32); 

}

针对2):

换俗点的说法,派生类自己有一个和基类一模一样的,干嘛还要调用基类的。


对于隐藏,有一个要特别注意的地方。

class Rectangle
{
public:
     void SetWith(double w) { m_width = w; }
     void SetHeight(double h) { m_height = h; }

private:
     double m_width;
     double m_height;
};

class Square : public Rectangle
{
public:
     void SetWith(double w) 
     { 
          Rectangle::SetWith(w);
          Rectangle::SetHeight(w);
     }

     void SetHeight(double h)
     {
          Rectangle::SetWith(h);
          Rectangle::SetHeight(h);
     }
};

void func(Rectangle& r)

{

     r.SetWith(32);

}

void main()

{

     Square s;

   

     // func中调用的是Rectangle::SetWith,

     // 意味着正方形的高是一个任意值

     func(s); 

     return 0;

}

时间: 2024-09-20 18:35:38

重载、覆盖和隐藏的相关文章

C++中的重载、覆盖、隐藏介绍_C 语言

前几天面试时被问及C++中的覆盖.隐藏,概念基本答不上来,只答了怎么用指针实现多态,也还有遗漏.最终不欢而散.回来后在网上查找学习了一番,做了这个总结.其中部分文字借用了别人的博客,望不要见怪. •概念 一.重载(overload)指函数名相同,但是它的参数表列个数或顺序,类型不同.但是不能靠返回类型来判断. (1)相同的范围(在同一个作用域中) : (2)函数名字相同: (3)参数不同: (4)virtual 关键字可有可无. (5)返回值可以不同: 二.重写(也称为覆盖 override)是

关于C++类成员函数的重载、覆盖、隐藏与virtual关键字

1. 重载.覆盖与隐藏 1).重载:成员函数具有以下的特征时发生"重载" A.相同的范围(同一个类中) B.函数的名字相同 C.参数类型不同(不能进行隐式类型转换) D.Virtual关键字可有可无 2).覆盖(也叫"继承"):指派生类函数覆盖基类函数,特征是: A.不同的范围(分别位于基类与派生类中) B.函数名字相同 C.参数相同 D.基类函数必须有virtual关键字 3).隐藏:是指派生类的函数屏蔽了与其同名的基类函数,规则如下: A.如果派生类的函数与基类

C++ 成员函数的重载,继承,覆盖和隐藏

一. C++成员函数的重载 C++中的成员函数有四种,分别是普通成员函数,virtual虚函数,const成员函数. (1) void func(int a); (2) virtual void func(int a); (3) void func(int a) const; 如果在一个类中,声明这四种函数,哪是重复定义?哪些是重载? 其中(1)(2)是重复定义,故编译不能通过,而(3)与(1)(2)是不同类型的函数,是重载. 成员函数被重载的特征是: (1)具有相同的作用域(即同一个类定义中)

类成员函数的重载、覆盖与隐藏之间的区别总结_C 语言

答案:a.成员函数被重载的特征:(1)相同的范围(比如在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无. b.覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类):(2)函数名字相同:(3)参数相同:(4)基类函数必须有virtual 关键字. c."隐藏"是指派生类的函数屏蔽了与其同名的基类函数,规则如下:(1)如果派生类的函数与基类的函数同名,但是参数不同.此时,不论有无virtual关键字,基类的函数将被隐藏(注

java中重载、覆盖和隐藏三者的区别分析_java

重载:方法名相同,但参数不同的多个同名函数 注意:1.参数不同的意思是参数类型.参数个数.参数顺序至少有一个不同 2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg:void a ()和int a() ,如果调用a(),出现歧义) 3.main方法也是可以被重载的 覆盖:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同 两同两小一大  注意:子类实例方法不能覆盖父类的

C++概念重载、覆盖、隐藏的使用说明_C 语言

函数重载: 在C++程序中,可以将语义.功能相似的几个函数用同一个名字表示,即函数重载. 重载的实现: 几个同名的重载函数仍然是不同的函数,它们是如何区分的呢?我们自然想到函数接口的两个要素:参数与返回值.如果同名函数的参数不同(包括类型.顺序不同),那么容易区别出它们是不同的函数. 重载与覆盖成员函数被重载的特征: (1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: (4)virtual 关键字可有可无. 覆盖是指派生类函数覆盖基类函数,特征是: (1)不同的范围(分别

成员函数的重载、覆盖与隐藏详细解析_C 语言

1 重载与覆盖成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类):(2)函数名字相同:(3)参数相同:(4)基类函数必须有virtual 关键字.下面示例中,函数Base::f(int)与Base::f(float)相互重载,而Base::g(void)被Derived::g(void)覆盖. 复制代码 代码如下: #include <i

Java方法的覆盖与隐藏的区别分析_java

关于隐藏和覆盖的区别,要提到RTTI(run-time type identification)(运行期类型检查),也就是运行期的多态,当一个父类引用指向子类对象的时候,请看下面我编写的一段代码: 复制代码 代码如下: public class RunTime {     public static void main(String[] args) {        Animal a = new Cat();        System.out.println(a.A);        Syst

c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)

一. sizeof计算结构体 注:本机机器字长为64位 1.最普通的类和普通的继承 #include<iostream> using namespace std; class Parent{ public: void fun(){ cout<<"Parent fun"<<endl; } }; class Child : public Parent{ public: void fun(){ cout<<"Child fun&quo