c++虚函数(c++虚函数有什么用)

本篇文章给大家谈谈c++虚函数,以及c++虚函数有什么用对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

c中的虚函数有什么作用

c++中的虚函数的作用如咐歼下:

1、实现多态性,多态性是将接口与实现进行分离。

2、实现以共同的方法,但因个体差异而采用不同的策衡腊冲略。

3、在有可能成为父类时,虚函数可以被同名局闹子类函数覆盖,安全系数高。

4、虚函数的主要作用是对派生类实现动态联编。

5、调用的函数在基类中被说明为虚函数,子类中该函数会自动成为虚函数。

C++ 中什么样的函数可以作为虚函数

二,哪些函数不能成为虚函数?

1.内联函数:我们都知道内联函数只是在函数调弊稿用点将其展开,它不能产生函数符号,所以不能往虚表中存放,自然就不能成为虚函数。

2.静态函数:定义为静态函数的函数,这个函数只和类有关系,它不完全依赖于对象调用,所以也不能成为租兆孝虚函数。

3.构造函数:都知道只有当调用了构造函数,这个对象才能产生,如果把构造函数写成虚函数,这时候我们的对象就没有办法生 成。更别说用对象去调用了。所以构造函数不能成为虚函数。

4.友元函数:友元函数不属于类的成员函数,不能被继承。对于没有继承特性的函数没有虚函数的说法。

5.普通函数:普通函数不属于成员函数,是不能被继承的。普通函数只能被重载,不能被重写,因此声明为虚函数没有意义。因为编译器会在编译时绑定函数。

三,哪些函数可以成为虚函数呢?

1.普通的成员方法是可以成为虚函数的

2.还有析构函数,因为析构函数是为了释放对象的,所以之前我们的对象已经生成,而且析构函数可以取地址,所以可以成为虚函数。

—猜橡———————————————

版权声明:本文为CSDN博主「u010765526」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:

[img]

C++,虚函数,

如果派生类定义了一个与基类同名,但具有不同参数的函数,这个函数究竟有没有被加入到派生类的虚函数表中?答案是yes。注意,不是虚函数就不来凑这个热闹了。

#include "pch.h"

#include string

#include iostream

using std::cout;

using std::endl;

class brass

{

private:

int a;

public:

brass() :a(5) 

{

};

virtual void with()

{

cout  a  endl;

}

};

class brassplus : public brass

{

private:

int b;

public:

brassplus() :b(6) 

{

};

virtual void with()

{

cout  "1:"  b  endl;

}

virtual void with(int i)

{

cout  "2:"  b  endl;

}

};

int main()

{

brass* a;

brassplus b;

a = (brass*)b;

a-with();

b.with(1);

b.brass::with();

}

口说无凭,现在我们就上vs2017调试器,揭开虚函数表的面纱。首先用鼠标在编辑器左栏下断点,断点下在brassplus b;一行,然后点击“本地Windows调试器”进入调试模式。

调试器运行到断点停了下来,此时brassplus b; 这行代码是未执行的,我们将对它橘老亩单步执行。

单步执行的快捷键是F11。如果想一次执行完一个过程(或称为函数),则用它旁边的那个“逐过程”调试键(F10)。

连按几次F11,直到看到派生类b的成员b被初始化为6。看到红色地址0x00aff7ec了吗,这个地址就是派生类brassplus的对象b在内存中的起始地址。

我们在“内存窗口”的地址栏输入上述地址0x00aff7ec,看到了没有,第一个值(0x00b89b40)就是“虚函数表指针”,后面还跟着已经被分别初始化为5和6的两个类成员。如果你的c语言学得比较扎实,就应该知道所谓的指针就是内存中的地址,现在我们就去“虚函数表指针”指向的地址,看一看虚函数表中究竟包含了几项。

虚函数表包含了两项,分别是0x00b813a2和0x00b8125d,它们表示虚函数在内存中的位置。到了这里,我们已经肯定了开篇的结论。但为了加深初学者的印象,我们继续往下走几步。这两项中的每一项,更准确地说,表示了一个地址,即一条跳转指令在内存中的地址,cpu执行完这条跳转指令就能顺利跳到虚函数在内存中的真正位置。现在我们到这两个地址看圆森一看。

为了把指令弄明白,我们使用反汇含租编窗口,内存窗口更适于看数据。看到了吧,0x00b813a2所在位置是一条jmp跳转指令,执行了它会跳到哪里去呢?调试器已经帮我们算出来了,是0x00b82890。

在0x00b82890,我们看到了虚函数virtual void with()的实现。

同理,第二项0x00b8125d,所在处是一条jmp指令,跳转至0x00b827e0。

在0x00b827e0,我们看到了虚函数virtual void with(int i)的实现。

最后把上面说的内容总结一下,借几天前画的一张图。总之,在上机后,书中的任何错误和含糊之处就会暴露无疑,每纠正一个错误,你就比别人更前进一步。

c++ 虚函数

选项B是正确的。

其实判断是否是毕缓虚函数并不难。

有侍念virtual关键字修饰的函数就是虚函数,没有virtual关键字修饰的就不是虚函数。

class A{

public:

virtual void func1(){ } //虚函数

void func2(){ } //不是虚函数

};

class B:public A{

public:

void func1(){cout”class B func1”endl;} //不是虚函数

virtual void func2(){cout”class B func2”endl;} //虚函数 };

这个问题之外的小知识:

1,虚函数的本质是能实现动态绑定,和能否继老数困承无关。

2,虚函数的"特质"是不能继承的。

例如:A::func1()是虚函数,但是B类的func1()没有virtual修饰,就不是虚函数。

关于c++虚函数和c++虚函数有什么用的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表