关于C++的虚方法问题
伊谢尔伦
伊谢尔伦 2017-04-17 14:35:06
0
5
881

我在看到C++的虚方法 的时候,怎么突然有种多此一举的感觉。比如有个基类 Class Mammal{};然后又有个派生类 Class Dog : public Mammal {};然后我弄个对象出来 Dog Fido; 按道理来说 Fido这个条狗 就能继承 Mammal这个类 public 里面的所有方法(除了Dog类里面被覆盖的)。

然后我们再来看下 虚方法这个东东。要让虚方法 virtual 起作用, 那么new 出来的 对象 必须要用其基类的指针变量来接收 ,比如: Mammal * Fido = new Dog ;等到 用 Fido来调用方法的时候 首先是先去Mammal里面找 如果找到的函数 是个虚函数,那么久忽略掉这个函数 用Dog(Dog 里面有个同名的函数) 类里面的函数。

当我看到 虚函数的这个作用的时候,我感觉不都是继承嘛!还搞这么多花样,在我目前的学习阶段,我主观上没发现该虚方法有什么好处。 大家来谈谈看撒!

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

répondre à tous (5)
Peter_Zhu

虚函数用于多态。比如在游戏中,所有的玩家和敌人都可以继承同一个游戏角色类,其内部的更新函数和渲染函数是虚函数。用一个基类指针数组来储存这些不同的玩家和敌人,更新和渲染时只需一个for循环就好了,省去了很多功夫。

    巴扎黑

    设想一下如下场景:
    你有一个UI库,有很多组件,如TextEditor,Button等,它们都是以UIBase为基类的;
    现在,你要遍历所有的组件,找出所有类型为Button的组件

    那么使用虚方法就能很轻松地实现:
    首先为UIBase添加一个虚方法char* GetType()(在这个例子中,其实添加为纯虚方法更合适一点),然后每个子类都重写GetType(),比如Button类就重写为char* GetType(){return "Button";}

    由于我可以用基类指针保存子类对象,那么我只要维护一个数组UIBase *a[],每次新建元素的时候都加入到a当中,那么回到我的需求上来,只要执行for(k in a) if(k->GetType()=="Button"){...}

      大家讲道理

      C++虚函数: 多态的实现必不可少一部分。 多态? -> 代码复用的最高境界,工程意义,调用未来。

      C++没有接口, 如何实现? 纯虚函数接口类。

      虚析构, 接口的封装和设计。

      原理:动态链编

        Ty80

        举个例子:

        比如说,如果Mammal和Dog都定义了虚函数 virtual void do()。此时你定义了一个函数

        void fun(Mammal * ani) { ani->do(); } Mammal * ani = new Dog(); fun(ani);

        那么此时,参数可以传入Mammal或者Dog对象指针。如上一段代码,由于ani指针所指向的对象,实际类型是Dog,所以调用ani->do()时,由于do是虚方法,所以将调用Dog::do()。

        但是如果do不是虚方法,那么ani->do()实际执行的将是Mammal::do();

          巴扎黑

          关于这些东西,在《深度探索C++对象模型》这本书里面有比较详细的描述。
          虚函数涉及到的是运行时绑定,非虚函数是编译时绑定。
          举个例子。

          #include  using namespace std; class A{ public: void f1(){cout<<"A::f1"<>t; switch(t){ case 'B': case 'b': p = new B;break; case 'C': case 'c': p = new C;break; case 'A': case 'a': default: p = new A; } p->f1(); // 这里将始终输出 A::f1,编译时候就确定了 p->f2(); // 这里是在运行时才能确定的 // p指向的对象中包含虚函数指针,指向虚函数表 // 调用f2的时候是根据这个指针去确定使用哪一个的 }
            Derniers téléchargements
            Plus>
            effets Web
            Code source du site Web
            Matériel du site Web
            Modèle frontal
            À propos de nous Clause de non-responsabilité Sitemap
            Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!