精华内容
下载资源
问答
  • C++中虚函数作用

    2020-08-03 21:18:04
    C++中虚函数作用主要是实现了多态的机制。基类定义虚函数,子类可以重写该函数;在派生类对基类定义的虚函数进行重写时,需要再派生类声明该方法为虚方法。 当子类重新定义了父类的虚函数后,当父类的指针...

    C++中的虚函数的作用主要是实现了多态的机制。基类定义虚函数,子类可以重写该函数;在派生类中对基类定义的虚函数进行重写时,需要再派生类中声明该方法为虚方法。

    当子类重新定义了父类的虚函数后,当父类的指针指向子类对象的地址时,[即B b; A a = & b;] 父类指针根据赋给它的不同子类指针,动态的调用子类的该函数,而不是父类的函数(如果不使用virtual方法,请看后面★),且这样的函数调用发生在运行阶段,而不是发生在编译阶段,称为动态联编。而函数的重载可以认为是多态,只不过是静态的。注意,非虚函数静态联编,效率要比虚函数高,但是不具备动态联编能力。

    ★如果使用了virtual关键字,程序将根据引用或指针指向的对象类型来选择方法,否则使用引用类型或指针类型来选择方法。

    下面的例子解释动态联编性:

    class A{
    private:
        int i;
    public:
        A();
        A(int num) :i(num) {};
        virtual void fun1();
        virtual void fun2();
    
    };
    
    class B : public A{
    private:
        int j;
    public:
        B(int num) :j(num){};
        virtual void fun2();// 重写了基类的方法
    };
    
    // 为方便解释思想,省略很多代码
    A a(1);
    B b(2);
    A *a1_ptr = &a;
    A *a2_ptr = &b;
    
    // 当派生类“重写”了基类的虚方法,调用该方法时
    // 程序根据 指针或引用 指向的  “对象的类型”来选择使用哪个方法
    a1_ptr->fun2();// call A::fun2();
    a2_ptr->fun2();// call B::fun1();
    // 否则
    // 程序根据“指针或引用的类型”来选择使用哪个方法
    a1_ptr->fun1();// call A::fun1();
    a2_ptr->fun1();// call A::fun1();
    

    原文链接:https://blog.csdn.net/iFuMI/article/details/51088091

    展开全文
  • 高质量的C++多态讲解,详细讲解虚函数虚函数表,虚函数继承,虚函数继承下的内存分配等
  • C++虚函数实现原理

    2015-10-24 21:11:09
    虚函数中虚函数的分布情况;其中包括发生继承的情况下虚函数中虚函数的分布情况;
  • 主要介绍了C++ const修饰虚函数实例详解的相关资料,需要的朋友可以参考下
  • 主要介绍了C++中虚析构函数作用及其原理分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 主要介绍了C++中虚函数,在C++中,虚函数联系到多态、多态联系到继承,因而虚函数C++中的一大重要特性,需要的朋友可以参考下
  • 本篇文章是对C++中虚析构函数作用进行了详细的分析介绍,需要的朋友参考下
  • 主要介绍了c++中虚函数和纯虚函数的作用与区别,需要的朋友可以参考下
  • C++中虚函数和纯虚函数的区别

    千次阅读 2020-12-20 16:14:18
    C++面向对象程序设计有三大思想:抽象、继承、多态

    C++面向对象程序设计有三大思想:抽象、继承、多态

    其中多态的实现建立在子类继承父类的基础上,它是由C++编译器的一个核心技术实现,即动态绑定技术。其核心思想是父类对象调用子类对象的方法。而父类对象调用子类对象的方法时,这个被调用的方法必须在父类中声明为虚函数,因此虚函数是实现多态的一个中介。而纯虚函数是将父类上升为一个抽象类,抽象类无法实例化,只有方法的声明,其实现由其子类完成。就像动物无法实例化为具体的对象,而老虎、狮子都可以继承动物的特性(即父类的接口),从而有自己的实例化对象。

    以下是虚函数和纯虚函数的区别点:

    1、类如果声明了虚函数,这个函数是实现了的,即使是空实现,它的作用就是为了能让这个函数在它的子类里面可以被覆盖,这样编译器就可以使用动态绑定来达到多态的目的(即父类指针指向子类对象,调用子类方法)。而纯虚函数只是在基类中的一个函数定义,即是一个函数声明而已,具体的实现需要留到子类当中。

    2、虚函数在子类里面也可以不进行重写(只有虚方法和抽象方法才能够被重写);但纯虚函数必须在子类去实现。

    3、虚函数的类用于“实作继承”,也就是说继承接口的同时也继承了父类的实现。当然,子类也可以进行覆写,从而完成自己关于此函数的实现。纯虚函数的类用于“介面继承”,即纯虚函数关注的是接口的统一性,实现由子类去完成。

    4、带纯虚函数的类叫做抽象类,这种类不能直接生成对象,而只有被继承,并重写其虚函数后,才能使用。

    代码示例:

    #include <iostream>
    using namespace std;
    
    // 抽象类
    class Base {
    public:
        virtual void func() = 0;	// 纯虚函数
    };
    
    
    class child1 : public Base {
    public:
    	void func() { cout << "it's child 1" << endl; }	// 覆写父类的纯虚函数
    };
    
    class child2 : public Base {
    public:
    	void func() { cout << "it's child 2" << endl; }	// 覆写父类的纯虚函数
    };
    
    int main() {
    	// Base b; // 纯虚函数无法实例化
    	Base* b = nullptr; // 父类指针
    	child1 c1; // 子类对象
    	child2 c2; // 子类对象
    
    	b = &c1;
    	b->func();	// 多态
    
    	b = &c2;
    	b->func();	// 多态
    	return 0;
    }
    

    代码输出:

    it's child 1
    it's child 2
    
    

    总结:

    虚函数和纯虚函数都是为了多态这一特性而服务的,不同的点是纯虚函数将父类上升为一个抽象类,无法实例化对象,只有接口声明,而其子类需要去实现父类中的声明,这就统一了接口,只需要使用父类指针,指向具体的子类对象,去调用相应的虚方法即可。

    谢谢阅读

    展开全文
  • 本篇文章是对c++中虚函数与纯虚函数的区别进行了详细的分析介绍,需要的朋友参考下
  • c++类的实例解析虚函数表,查看虚表的地址,利用虚函数表中的地址调用虚函数实现C++中的多态特性, 此例是解析虚函数中简单易于理解的示例,重要的地方具有详细的注释。亲测可用,若有不清除的地方,可以留言,...
  • 下面小编就为大家带来一篇探讨C++中不能声明为虚函数的有哪些函数。希望对大家有所帮助。一起跟随小编过来看看吧,祝大家游戏愉快哦
  • c++中虚函数表的作用主要是实现了多态的机制。首先先解释一下多态的概念,多态是c++的特点之一,关于多态,简而言之就是 用父类的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数,这种方法呢,...
  • 主要介绍了C++编程虚函数与虚基类的实例讲解,虚函数与虚基类的使用是C++入门学习的基础知识,需要的朋友可以参考下
  • C++中重载与重写函数区别及虚函数
  • C++中虚函数与纯虚函数的区别

    千次阅读 2019-01-12 09:17:59
    从使用目的来说,我们用C++处理未知类型的对象的方法就是使用虚函数。 下面是一个虚函数的创建一个虚函数的例子 而纯虚函数在类(父类)只提供声明,不提供实现,实现由子类去完成。 下面是一个纯虚函数创建...

    从使用目的来说,我们用C++处理未知类型的对象的方法就是使用虚函数。

    下面是一个虚函数的创建一个虚函数的例子

    而纯虚函数在类(父类)中只提供声明,不提供实现,实现由子类去完成。

    下面是一个纯虚函数创建的例子

    使用纯函数的目的是为了实现“运行时的多态”,它是一种接口继承,是对子类的约束

    资料参考:https://blog.csdn.net/qq_37699336/article/details/78524890

    展开全文
  • C++虚函数详解

    万次阅读 多人点赞 2019-04-08 19:31:35
    C++虚函数详解 前言 C++的特性使得我们可以使用函数继承的方法快速实现开发,而为了满足多态与泛型编程这一性质,C++允许用户使用虚函数**(virtual function)来完成运行时决议这一操作,这与一般的编译时决定**...

    C++虚函数详解

    前言

    C++的特性使得我们可以使用函数继承的方法快速实现开发,而为了满足多态与泛型编程这一性质,C++允许用户使用虚函数 (virtual function) 来完成 运行时决议 这一操作,这与一般的 编译时决定 有着本质的区别。

    虚函数表实现原理

    虚函数的实现是由两个部分组成的,虚函数指针与虚函数表。

    虚函数指针

    虚函数指针 (virtual function pointer) 从本质上来说就只是一个指向函数的指针,与普通的指针并无区别。它指向用户所定义的虚函数,具体是在子类里的实现,当子类调用虚函数的时候,实际上是通过调用该虚函数指针从而找到接口。

    虚函数指针是确实存在的数据类型,在一个被实例化的对象中,它总是被存放在该对象的地址首位,这种做法的目的是为了保证运行的快速性。与对象的成员不同,虚函数指针对外部是完全不可见的,除非通过直接访问地址的做法或者在DEBUG模式中,否则它是不可见的也不能被外界调用。

    只有拥有虚函数的类才会拥有虚函数指针,每一个虚函数也都会对应一个虚函数指针。所以拥有虚函数的类的所有对象都会因为虚函数产生额外的开销,并且也会在一定程度上降低程序速度。与JAVA不同,C++将是否使用虚函数这一权利交给了开发者,所以开发者应该谨慎的使用。

    虚函数表

    此板块图片及部分内容引自于haoel大大的博客,地址:
    https://blog.csdn.net/haoel/article/details/1948051
    

    上文已经提到,每个类的实例化对象都会拥有虚函数指针并且都排列在对象的地址首部。而它们也都是按照一定的顺序组织起来的,从而构成了一种表状结构,称为虚函数表 (virtual table)

    我们先来规定一个基类

    class Base
    {
        public:
        virtual void f(){cout<<"Base::f"<<endl;}
        virtual void g(){cout<<"Base::g"<<endl;}
        virtual void h(){cout<<"Base::h"<<endl;}
    };
    
    

    首先对于基类Base它的虚函数表记录的只有自己定义的虚函数

    Base

    接下来我们来看看子类的情况

    class Derived:public Base
    {
    	public:
        virtual void f(){cout<<"Derived::f"<<endl;}
        virtual void g1(){cout<<"Derived::g1"<<endl;}
        virtual void h1(){cout<<"Derived::h1"<<endl;}
    }
    

    ·一般覆盖继承

    首先是最常见的继承,子类Derived对基类的虚函数进行覆盖继承,在这个例子中仅设计了一个函数继承的情况以此推广情况。

    那么此时情况是这样的:

    首先基函数的表项仍然保留,而得到正确继承的虚函数其指针将会被覆盖,而子类自己的虚函数将跟在表后。

    而当多重继承的时候,表项将会增多,顺序会体现为继承的顺序,并且子函数自己的虚函数将跟在第一个表项后。


    C++中一个类是公用一张虚函数表的,基类有基类的虚函数表,子类是子类的虚函数表,这极大的节省了内存

    同名覆盖原则与const修饰符

    如果继续深入下去的话我们将会碰见一个有趣的状况

    class Base
    {
    public:
    	virtual void func()const
    	{
    		cout << "Base!" << endl;
    	}
    };
    class Derived :public Base
    {
    public:
    	virtual void func()
    	{
    		cout << "Derived!" << endl;
    	}
    };
    
    void show(Base& b)
    {
    	b.func();
    }
    Base base;
    Derived derived;
    
    int main()
    {
    	show(base);
    	show(derived);
    	base.func();
    	derived.func();
    	return 0;
    }
    

    在上述程序中我们将Base类中的虚函数base定义为const类型,我们知道const后缀的目的是为了限定该函数不对类内成员做出修改。然后我们分别声明base与derived并且通过show函数调用它们的func函数,子类传参给父类也是非常正常的一个操作,但是结果可能却令人不解:

    Base!
    Base!
    Base!
    Derived!
    

    这里有一个很大的问题,因为当我们将derived传过去的时候并没有调用derived的虚函数!也就是说虚函数不再是多态的了。

    但是的话我们只需要简单的修改任意一项:将line4结尾的const限定符去掉或者将Derived的func1后加上const便可以使一切正常。这是为什么呢?

    很多其他的博客将其解释为是const符号作用的原因,但实际上这样的解释并不正确。正确的原因是:

    虚函数的声明与定义要求非常严格,只有在子函数中的虚函数与父函数一模一样的时候(包括限定符)才会被认为是真正的虚函数,不然的话就只能是重载。这被称为虚函数定义的同名覆盖原则,意思是只有名称完全一样时才能完成虚函数的定义。

    因此在上述的例子中,将Derived类型的子类传入show函数时,实际上类型转化为了Base,由于此时虚函数并未完成定义,Derived的func()此时仅仅是属于Derived自己的虚函数,所以在show中b并不能调用,而调用的是Base内的func。而当没有发生类型转换的时候,Base类型与Derived类型就会各自调用自己的func函数。

    展开全文
  • C++虚函数及虚函数表解析,内容详细,分析清晰,推荐给大家。
  • 关于C++中虚函数作用

    万次阅读 多人点赞 2015-11-21 15:39:47
    昨天去面试,面试官问道:虚函数有什么作用,我解释了半天也没解释清楚,其实说到底还是理解不够深刻,或者说简直没什么理解,连子类重写父类的普通函数和子类重写父类的虚函数的区别都不知道,真是弱爆了!...
  • 本文档详细介绍了C++中虚函数的原理以及在何场景下要用到虚函数
  • 1.C++中虚函数C++中虚函数作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是...
  • 虚函数C++用于实现多态(polymorphism)的机制,核心理念就是通过基类访问派生类定义的函数。定义虚函数是为了用基类的指针来调用子类的函数。 下面介绍的是虚函数的一个典型应用: #include using namespace std;...
  • C++虚函数的实现

    千次阅读 2019-05-09 16:41:17
    http://blog.kongfy.com/2015/08/探索c虚函数在g的实现/?utm_source=tuicool&utm_medium=referral https://blog.csdn.net/haoel/article/details/1948051 目录 一、虚函数表解析 前言 虚函数表 一般继承...
  • C++中虚函数的用法详细讲解

    千次阅读 2015-10-15 22:43:51
    我们知道,在同一类是不能定义...例如在例12.1(具体代码请查看:C++多态性的一个典型例子)程序,在Circle类定义了 area函数,在Circle类的派生类Cylinder也定义了一个area函数。这两个函数不仅名字相同,而
  • C++虚函数表详解

    千次阅读 多人点赞 2019-01-05 09:51:57
    C++虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。在这个表,主要是一个类的虚函数的地址表,这张表解决了继承、覆盖(override)的问题,保证其能真实的反应实际的函数。...
  • 文章目录C++中虚函数(涉及函数重载,重写, 隐藏!!!)一个简单的“猫吃老鼠”例子**“什么是虚函数”**“什么是虚函数表,什么是虚函数指针” C++中虚函数(涉及函数重载,重写, 隐藏!!!) 一个简单的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 139,447
精华内容 55,778
关键字:

c++中虚函数的作用

c++ 订阅
友情链接: JSBSimForUe4.rar