多态(2)纯虚函数与重载、重写(覆盖)、重定义(隐藏)

您所在的位置:网站首页 纯虚函数能被调用吗 多态(2)纯虚函数与重载、重写(覆盖)、重定义(隐藏)

多态(2)纯虚函数与重载、重写(覆盖)、重定义(隐藏)

2024-04-27 19:22| 来源: 网络整理| 查看: 265

1 class A { 2 public: 3 A(); 4 virtual ~A(); 5 void f1(); 6 virtual void f2(); 7 virtual void f3()=0; 8 }; 9 class B:public A{ 10 public: 11 B(); 12 virtual ~B(); 13 void f1(); 14 virtual void f2(); 15 virtual void f3(); 16 }; 17 int main(int argc,char * argv[]) { 18 A *m_j = new B(); 19 m_j -> f1(); 20 m_j -> f2(); 21 m_j -> f3(); 22 delete m_j; 23 return 0; 24 } f1()是一个隐藏,调用m_j->f1();会去调用A类中的f1(),它是在我们写好代码的时候就会定好的。也就是根据它是由A类定义的,这样就调用这个类的函数。f2()是重写(覆盖)调用m_j->f2();会调用m_j中到底保存的对象中,对应的这个函数。这是由于new的B对象(调用派生类的f2())f3()与f2()一样,只是在基类中不需要写函数实现。 1 class Person 2 { 3 vi rtual voi d Di splay () = 0; // 纯虚函数 4 protected : 5 stri ng _name ; // 姓名 6 } ; 7 class Student : publi c Person 8 { } ; 总结:

1. 虚函数的定义形式:virtual {method body}   纯虚函数的定义形式:virtual { } = 0;

2. 虚函数和纯虚函数可定义在同一个类(class)中,含有纯虚函数的类是抽象类(abstract class),而含有虚函数的类则不是。

3. 对抽象类进行实例化将会报错,因为抽象基类(ABC)是不能被直接调用的,必须被子类继承重写以后,根据要求调用其子类的方法,因为纯虚函数在基类(base class)只有声明而没有定义。目的是提供一个统一的接口。虚函数可以被直接使用,也可以被子类(sub class)重写后以多态的形式调用。父类和子类都有各自的版本,调用的时候动态绑定。

4. 在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时候要求前期bind,然而虚函数却是动态绑定(run-time bind),而且被两者修饰的函数生命周期(life recycle)也不一样。

5. 虚函数必须实现,如果不实现,编译器将报错,错误提示为:error LNK****: unresolved external symbol "public: virtual void __thiscallClassName::virtualFunctionName(void)"

6. 实现了纯虚函数的基类,该纯虚函数可以被子类重写成虚函数,子类的子类即孙子类可以覆盖该虚函数,由多态方式调用的时候动态绑定。

7. 多态性是指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。a.编译时多态性:通过重载函数实现。b 运行时多态性:通过虚函数实现。

重载、重写、重定义 1.什么是函数重载

重载,简单说,就是函数或者方法有相同的名称,但是参数列表不同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。重载的规则:   1、在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数可以是参数类型,参数个数,参数顺序(参数类型必须不一样);   2、不能通过访问权限、返回类型、抛出的异常进行重载;   3、方法的异常类型和数目不会对重载造成影响;

成员函数被重载的特征:

(1)相同的范围(在同一个类中); (2)函数名字相同; (3)参数不同; (4)virtual 关键字可有可无 。

其中与其他另外两个概念最大的区别是:函数重载在同一个作用域内。

因为首先函数重载的第一个条件就没有满足,即:在相同的范围中(在同一个类中),派生类和基类是两个不同的类域,即不是同一个作用域,所以在继承中,基类和派生类之间永远不可能进行函数重载。

1 class Base 2 { 3 public: 4 Base(int data = 0) 5 :b(data) 6 { 7 cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3