博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于函数重载、多态的一些错误总结
阅读量:4973 次
发布时间:2019-06-12

本文共 1343 字,大约阅读时间需要 4 分钟。

一、重载

class Base

{

public:
  void fun(float f)
  {
    cout << f << endl;
  }
};
class Derived: public Base
{
public:
  void fun(float f, float f2)
  {
    cout << f+1 << endl;
  }
};
int main(int argc, char *argv[])
{
  Derived d;

  d.fun(3.14f);

}

上述程序本意是派生类重载基类的函数,但是事与愿违,编译器报错,错误信息是缺少参数。由此可见,派生类不能重载基类的同名函数,派生类的函数会将基类的所有同名函数全部都覆盖,重载函数只存在于同级中。

二、多态的使用

class Base

{

public:
  virtual void fun(float f)
  {
    cout << f << endl;
  }
};
class Derived: public Base
{
public:
  void fun(int f)
  {
    cout << f+1 << endl;
  }
};
int main(int argc, char *argv[])
{
  Derived d;

  Base *base = &d;

  base->fun(3.14f);

}

上述程序本意是利用C++多态性,用指向base的指针调用Derived的对象的函数,但是事与愿违,没有实现功能。原因是Derived类中的void fun(int f) 参数类型是int,与基类不同,被识别成不同的函数。所以,要利用多态性,需要函数名和参数列表相同,当然,这个时候返回值也必须相同,否则报错(函数名和参数列表相同则被认为是同一函数)。

三、多态的形式,伪多态

class Base

{

public:
  virtual void fun(float f)
  {
    cout << f << endl;
  }
};
class Derived: public Base
{
public:
  void fun(float f, float f2)
  {
    cout << f+1 << endl;
  }
};
int main(int argc, char *argv[])
{
  Derived d;

  Base *base = &d;

  base->fun(3.14f, 3.14f);   //错误

}

本程序与多态其实没有半毛钱关系,形似而已。从类定义可以看出,基类的fun与派生类的fun参数列表不同,所以仅仅是重写,不是多态。将派生类的对象的地址赋值给指向基类的对象的指针,之后希望用指针调用派生类对象的函数,但是C++的多态性(即用基类的指针调用派生类对象的函数)是在运行时发生的,在编译时基类指针调用的函数还是理解为基类对象的函数,而该程序中基类的fun函数没有2个参数,所以编译出错。

 

转载于:https://www.cnblogs.com/bigfish2013/p/3406888.html

你可能感兴趣的文章
c#中从string数组转换到int数组
查看>>
java小技巧
查看>>
POJ 3204 Ikki's Story I - Road Reconstruction
查看>>
iOS 加载图片选择imageNamed 方法还是 imageWithContentsOfFile?
查看>>
toad for oracle中文显示乱码
查看>>
SQL中Group By的使用
查看>>
两个表格中数据不用是一一对应关系--来筛选不同数据,或者相同数据
查看>>
hiho_offer收割18_题解报告_差第四题
查看>>
AngularJs表单验证
查看>>
静态方法是否属于线程安全
查看>>
02号团队-团队任务3:每日立会(2018-12-05)
查看>>
SQLite移植手记1
查看>>
js05-DOM对象二
查看>>
mariadb BINLOG_FORMAT = STATEMENT 异常
查看>>
iPhone在日本最牛,在中国输得最慘
查看>>
动态方法决议 和 消息转发
查看>>
C#生成随机数
查看>>
Java回顾之多线程
查看>>
机电行业如何进行信息化建设
查看>>
9、总线
查看>>