virtual关键字在子类

Posted windmissing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了virtual关键字在子类相关的知识,希望对你有一定的参考价值。

运行结果是什么?

]

father *pf = new father();
pf->f();
delete pf;
father *ps = new son();
ps->f();
delete ps;
son *ps1 = new son();
ps1->f();
delete ps1;
son *pss = new sonson();
pss->f();
delete pss;

运行结果

father::f()
father::f()
son::f()
sonson::f()

解释与结论

id指针名指针的类型实际的类型运行结果解释
1pffatherfatherfather::f()
2psfathersonfather::f()实际调用的是指针的类型的函数,说明没有多态
3ps1sonsonson::f()
4psssonsonsonsonson::f()实际调用的是对象的类型的函数,说明有多态的效果

结论:

  1. 如果virtual只写在派生类中,而没有写在基类中,则不会有多态的效果

  2. 如果在某一层的派生类中加了virtual标签,那么从这一层开始以后的每一层,这个函数都会有多态的效果。

其它测试

virtual关键字在父类

析构函数的virtual在子类

间接调用虚函数

完整代码

#include <iostream>
using namespace std;

class father

public:
  void f()
  
    cout<<"father::f()"<<endl;
  
;

class son : public father

public:
  virtual void f()
  
    cout<<"son::f()"<<endl;
  
;

class sonson : public son

public:
  void f()
  
    cout<<"sonson::f()"<<endl;
  
;

int main()

    father *pf = new father();
    pf->f();
    delete pf;
    father *ps = new son();
    ps->f();
    delete ps;
    son *ps1 = new son();
    ps1->f();
    delete ps1;
    son *pss = new sonson();
    pss->f();
    delete pss;
    return 0;

以上是关于virtual关键字在子类的主要内容,如果未能解决你的问题,请参考以下文章

C#中virtual 方法和abstract方法的区别

虚方法与抽象方法

面向对象——多态

c#中virtual, abstract和override的区别和用法?

面向对象--多态虚方法重写抽象类接口

virtual关键字