怎么在c++中利用虚函数实现多态-创新互联

今天就跟大家聊聊有关怎么在c++中利用虚函数实现多态,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

创新互联公司主要从事成都网站设计、网站建设、外贸网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务高陵,十多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220
#include
using namespace std;
class CFather 
{
public:
  virtual void AA()  //虚函数标识符
  {
    cout << "CFather :: AA()" << endl;
  }
  void BB()
  {
    cout << "CFather :: BB()" << endl;
  }
};
class CSon : public CFather
{
public:
  void AA()
  {
    cout << "CSon :: AA()" << endl;
  }
  void BB()
  {
    cout << "CSon :: BB()" << endl;
  }
};
int main()
{
  cout << sizeof(CFather) << endl;         //测试加了虚函数的类

  system("pause");
  return 0;
}

怎么在c++中利用虚函数实现多态

很明显类里装了一个 4个字节的东西,除了整形int,就是指针了,没错这里装的就是函数指针

先把这个代码,给抽象成图形进行理解,在这CFather为A,CSon为B

怎么在c++中利用虚函数实现多态

此时就是一个单纯的继承的情况,不存在虚函数,然后我new一个对象,A *p = new A;那么 p -> AA(),必然是指向A类中的AA()函数,那么函数的调用有两种方式 一种函数名加()直接调用,一种是利用函数指针进行调用,在这里我想要调用子类的,就可以利用函数指针进行调用,假设出来两个函数指针,来指向B类中的两个成员函数,如果我父类想要调用子类成员,就可以通过 p指针去调用函数指针,再通过函数指针去调用成员函数

怎么在c++中利用虚函数实现多态

每一个函数都可以用一个函数指针去指着,那么每一类中的函数指针都可以形成自己的一个表,这个就叫做虚函数表

怎么在c++中利用虚函数实现多态

那么在创建对象后,为什么类中会有四个字节的内存空间呢?

在C++的标准规格说明书中说到,编译器必需要保证虚函数表的指针存在于对象中最前面的位置(这是为了保证正确取到虚函数的偏移量)。这意味着我们通过对象实例的地址得到这张虚函数表,然后就可以遍历其中函数指针,并调用相应的函数。也就是说这四个字节的指针,代替了上图中(p->*pfn)()的作用,指向了函数指针,也就是说,在使用了虚函数的父类成员函数,虽然写的还是p->AA(),实际上却是,(p->*(vfptr[0])),而指向哪个虚函数表就由,创建的对象来决定

怎么在c++中利用虚函数实现多态

至此,就能理解如何用虚函数这个机制来实现多态的了

下面,我将分别说明“无覆盖”和“有覆盖”时的虚函数表的样子。没有覆盖父类的虚函数是毫无意义的。我之所以要讲述没有覆盖的情况,主要目的是为了给一个对比。在比较之下,我们可以更加清楚地知道其内部的具体实现。

无虚数覆盖

下面,再让我们来看看继承时的虚函数表是什么样的。假设有如下所示的一个继承关系:

怎么在c++中利用虚函数实现多态

请注意,在这个继承关系中,子类没有重载任何父类的函数。那么,在派生类的实例中,Derive d; 的虚函表:

怎么在c++中利用虚函数实现多态

我们可以看到下面几点:

1)虚函数按照其声明顺序放于表中。

2)父类的虚函数在子类的虚函数前面。

有虚数覆盖

覆盖父类的虚函数是很显然的事情,不然,虚函数就变得毫无意义。下面,我们来看一下,如果子类中有虚函数重载了父类的虚函数,会是一个什么样子?假设,我们有下面这样的一个继承关系。

怎么在c++中利用虚函数实现多态

为了让大家看到被继承过后的效果,在这个类的设计中,我只覆盖了父类的一个函数:f()。那么,对于派生类的实例,其虚函数表会是下面的一个样子:

怎么在c++中利用虚函数实现多态

我们从表中可以看到下面几点,

1)覆盖的f()函数被放到了虚表中原来父类虚函数的位置。

2)没有被覆盖的函数依旧。

这样,我们就可以看到对于下面这样的程序,

Base *b = new Derive();

b->f();

看完上述内容,你们对怎么在c++中利用虚函数实现多态有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联网站建设公司行业资讯频道,感谢大家的支持。

另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


新闻名称:怎么在c++中利用虚函数实现多态-创新互联
浏览地址:http://ybzwz.com/article/dhhigo.html