C++面试常见--虚函数问题

1.虚函数的作用和用法
虚函数必须是基类的非静态成员函数,其访问权限可以是private或protected或public,在基类的类定义中定义虚函数的一般形式。在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,实现多态性。(来自百度百科)
虚函数是实现动态多态的方法。
虚函数的使用方法是:
1.在基类用virtual声明成员函数为虚函数。
这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便地被调用。在类外定义虚函数时,不必再加virtual。
2.在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。
C++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数(virtual 会被隐形继承)。因此在派生类重新声明该虚函数时,可以加virtual,也可以不加,但习惯上一般在每一层声明该函数时都加virtual,使程序更加清晰。如果在派生类中没有对基类的虚函数重新定义,则派生类简单地继承其直接基类的虚函数。
3.定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象。
4.通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数。
通过虚函数与指向基类对象的指针变量的配合使用,就能方便地调用同一类族中不同类的同名函数,只要先用基类指针指向即可。如果指针不断地指向同一类族中不同类的对象,就能不断地调用这些对象中的同名函数。

基类的析构函数,必须定义成虚函数,否则,当基类的指针调用子类的对象成员时,会造称析构不彻底,从而造成内存泄漏。

虚函数和纯虚函数的区别(转自这里

  1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class)。

  2. 虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用,因为纯虚函数在基类(base class)只有声明而没有定义。

  3. 虚函数和纯虚函数都可以在子类(sub class)中被重载,以多态的形式被调用。

  4. 虚函数和纯虚函数通常存在于抽象基类(abstract base class -ABC)之中,被继承的子类重载,目的是提供一个统一的接口。

  5. 虚函数的定义形式:virtual {method body}
    纯虚函数的定义形式:virtual { } = 0;
    在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时候要求前期bind,然而虚函数却是动态绑定(run-time bind),而且被两者修饰的函数生命周期(life recycle)也不一样。
    6 虚函数必须实现,如果不实现,编译器将报错,错误提示为:

    error LNK****: unresolved external symbol "public: virtual void __thiscall
    ClassName::virtualFunctionName(void)"码片`

  6. 对于虚函数来说,父类和子类都有各自的版本。由多态方式调用的时候动态绑定。

  7. 实现了纯虚函数的子类,该纯虚函数在子类中就变成了虚函数,子类的子类即孙子类可以覆盖该虚函数,由多态方式调用的时候动态绑定。

  8. 虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数

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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一些常见C++面试问题及其答案: 1. 什么是C++C++是一种面向对象的编程语言,用于开发高性能的应用程序,包括操作系统、游戏、数据库、Web浏览器、图形用户界面等。 2. C++中的继承是什么? 继承是一种面向对象的编程概念,它允许一个类继承另一个类的属性和方法。子类继承父类的所有公有成员,包括变量和函数。继承使得代码可重用性更高,同时也使代码更易于维护。 3. C++中的多态是什么? 多态是一种面向对象的编程概念,它允许不同的对象对同一消息作出不同的响应。在C++中,多态是通过继承和虚函数实现的。 4. C++中的虚函数是什么? 虚函数是一种特殊的成员函数,允许派生类重写基类的函数。当使用指向基类的指针或引用调用虚函数时,将调用派生类的版本。虚函数允许实现多态性。 5. C++中的引用是什么? 引用是一种指向变量的别名,它与指针不同,不需要使用解引用运算符。引用通常用于函数参数,允许修改函数调用中的变量。 6. C++中的const关键字是什么? const关键字用于定义常量,即不能更改的变量。const还可以用于函数参数和函数返回值,以指示它们不能被修改。const还可以用于类成员函数,以指示它们不会修改对象的状态。 7. C++中的模板是什么? 模板是一种通用编程技术,允许编写不依赖于特定数据类型的代码。模板可以用于函数和类,允许在编译时生成代码。 8. C++中的STL是什么? STL是标准模板库的缩写,是C++标准库的一部分。STL提供了一组通用的数据结构和算法,包括向量、列表、堆栈、队列、映射、集合、排序和搜索等。 9. C++中的内存管理是什么? C++中的内存管理是指程序在运行时如何使用和释放内存。C++中的内存由程序员手动分配和释放,使用new和delete运算符。C++还提供了一组智能指针类,帮助程序员管理内存。 10. C++中的异常处理是什么? 异常处理是一种处理程序运行时错误的方法,允许程序在出现错误时终止执行,并提供错误处理机制。C++中的异常处理使用try、catch和throw关键字实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值