C++ 虚拟函数如何在头、体和派生类中工作?

C++ 虚拟函数如何在头、体和派生类中工作?,c++,virtual,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"

我试图掌握如何使用虚拟函数

以下是正确的吗?我还会在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;
}

您不需要将
virtual
附加到父类中已声明为virtual的函数。
virtual
说明符指定非静态成员函数是虚拟的,并支持动态分派。它可能只出现在非静态成员函数初始声明的
decl说明符seq
中(即,当它在类定义中声明时)

什么是虚拟功能

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

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

如果一个类包含一个虚拟函数,那么编译器本身会做两件事:

  • 如果创建了该类的对象,则会插入一个虚拟指针(VPTR)作为该类的数据成员,以指向该类的VTABLE。对于创建的每个新对象,将插入一个新的虚拟指针作为该类的数据成员
  • 不管是否创建了对象,一个名为VTABLE的静态函数指针数组,其中每个单元格包含该类中包含的每个虚拟函数的地址
  • 关于虚拟函数的详细信息,已经有很多很好的答案

    您不需要将
    virtual
    附加到父类中已声明为virtual的函数。
    virtual
    说明符指定非静态成员函数是虚拟的,并支持动态分派。它可能只出现在非静态成员函数初始声明的
    decl说明符seq
    中(即,当它在类定义中声明时)

    什么是虚拟功能

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

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

    如果一个类包含一个虚拟函数,那么编译器本身会做两件事:

  • 如果创建了该类的对象,则会插入一个虚拟指针(VPTR)作为该类的数据成员,以指向该类的VTABLE。对于创建的每个新对象,将插入一个新的虚拟指针作为该类的数据成员
  • 不管是否创建了对象,一个名为VTABLE的静态函数指针数组,其中每个单元格包含该类中包含的每个虚拟函数的地址
  • 关于虚拟函数的详细信息,已经有很多很好的答案

    您的语法错误,您需要为您的语法定义提供范围functions@Tejendra你说得对!在写这篇文章的时候错过了。我现在就把它修好,让我的问题更清楚一点。谢谢,您确实需要将“Der.h”中的“base.h”包含在内,以使
    base
    Derived
    @NPE的声明中引用时可见。谢谢大家!@SharkTank1我希望答案能澄清所问的两个问题。您的语法错误,您需要为您的定义提供范围functions@Tejendra你说得对!在写这篇文章的时候错过了。我现在就把它修好,让我的问题更清楚一点。谢谢,您确实需要将“Der.h”中的“base.h”包含在内,以使
    base
    Derived
    @NPE的声明中引用时可见。谢谢大家!@SharkTank1我希望答案能澄清这两个问题。