虚函数如何在标头,正文和派生类中工作?

时间:2019-05-10 05:19:54

标签: c++ virtual

我正在尝试掌握如何使用虚函数。

以下内容正确吗?我也不会在base的.cpp文件中包含虚拟吗?

在定义派生类时,我是否还要在派生类的公共范围内声明虚函数?

//BASE HEADER FILE

#ifndef BASE_H
#define BASE_H

class Base { 
public: 
    virtual double testFunc() = 0;
    int func2(); 
};

#endif

//BASE.CPP FILE 
#include "base.h" 

int Base::func2()
{
    return 5; 
}

//DERIVED HEADER FILE

#ifndef DER_H
#define DER_H

#include "base.h"

class Derived : public Base { 
public: 
    double testFunc();
};
#endif

//DER.CPP FILE 
#include "Der.h" 

double Derived::testFunc()
{
    return 3.2;
}

1 个答案:

答案 0 :(得分:3)

您无需将virtual附加到在父类中已声明为virtual的函数。 virtual说明符指定一个非静态成员函数是虚拟的,并支持动态调度。它只能出现在非静态成员函数的初始声明的decl-specifier-seq中(即,在类定义中声明时)。

什么是虚拟功能

虚拟函数是在基类中声明的成员函数,并由派生类重新定义(重写)。当使用指针或对基类的引用来引用派生类对象时,可以为该对象调用虚拟函数并执行该派生类的函数版本。

虚拟功能的工作(VTABLE和VPTR的概念)

如果类包含虚函数,则编译器本身会做两件事:

  1. 如果创建了该类的对象,则将虚拟指针(VPTR)作为该类的数据成员插入,以指向该类的VTABLE。对于创建的每个新对象,将插入一个新的虚拟指针作为该类的数据成员。
  2. 与是否创建对象无关,它是一个称为VTABLE的函数指针的静态数组,其中每个单元格包含该类中包含的每个虚函数的地址。

有关虚拟功能的详细信息,已经有很多好的答案 How are virtual functions and vtable implemented?