【问题标题】:How do virtual functions work in the header, body and derived class?虚函数在头类、主体类和派生类中是如何工作的?
【发布时间】:2019-05-10 05:19:53
【问题描述】:

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

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

而在定义派生类的时候,是不是也要在派生类的public中声明虚函数呢?

//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;
}

【问题讨论】:

  • 您的语法错误,您需要为您的函数定义提供范围
  • @Tejendra 你是对的!写这个的时候错过了。我现在将修复它以使我的问题更清楚。谢谢
  • 您确实需要在“Der.h”中包含“base.h”,以便在 Derived 的声明中引用 Base 时可见。
  • @NPE 也修复了这个错误。谢谢!
  • @SharkTank1 我希望答案能明确提出的两个问题。

标签: c++ virtual


【解决方案1】:

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

什么是虚函数

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

虚函数的工作(VTABLE和VPTR的概念)

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

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

关于虚函数的详细信息,已经有很多很好的答案了 How are virtual functions and vtable implemented?

【讨论】:

    猜你喜欢
    • 2015-10-24
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    相关资源
    最近更新 更多