c++虚函数(c++虚函数有什么用)
本篇文章给大家谈谈c++虚函数,以及c++虚函数有什么用对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、c中的虚函数有什么作用
- 2、C++ 中什么样的函数可以作为虚函数
- 3、C++,虚函数,
- 4、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++虚函数有什么用的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。