繁体   English   中英

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

[英]How do virtual functions work in the header, body and derived class?

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

以下内容正确吗? 我也不会在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-specifier-seq中(即,在类定义中声明时)。

什么是虚函数

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

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

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

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

有关虚拟功能的详细信息,已经有很多不错的答案。 如何实现虚拟功能和vtable?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM