虚拟功能未在vptr中列出

Suj*_*osh 6 c++ visual-studio-2008

vptr索引应显示所有虚函数,但在我的情况下,只显示3个虚函数中的2个.

我提供完整的代码和截图如下: -

ClassHeader.h

#include <iostream>
using namespace std;

// Employee Class

class Employee
{
  public :
int salary ;
Employee(){cout << "Inside CTOR" << endl;}

virtual ~Employee() {cout << "Inside DTOR" << endl;}

virtual void pay(){cout << "Employee" << endl;}
};

// Manager Class

class Manager : public Employee
{
   public :

virtual void pay(){cout<< "Manager pay" << endl;}
virtual void Rank(){cout << "Manager Rank" << endl;}
};

// JuniorManager Class
class JuniorManager : public Manager
{
   public :

virtual void pay(){cout<< "JuniorManager pay" << endl;}
virtual void Rank(){cout << "JuniorManager Rank" << endl;}
};
Run Code Online (Sandbox Code Playgroud)

Main.cpp的

#include "ClassHeader.h"

void main()
{
    Manager *p = new Manager();

p->pay();
p->Rank();

p = new JuniorManager();
p->Rank();

Employee *pE = dynamic_cast<Employee*>(p);
pE->pay();

}
Run Code Online (Sandbox Code Playgroud)

Manager类有两个虚函数,pay和Rank,但只有pay显示在vptr中.

有人可以告诉我,为什么Rank不显示,即使它的虚函数.

我在Windows 7 64位上使用Visual Studio 2008,并使用最新更新.

在此输入图像描述

JuniorManager Debugger截图

它也没有显示虚函数.请看下面的图片.

在此输入图像描述

per*_*eal 2

如果您以 Employee 的身份检查该类,由于该类没有 Rank(),因此它不会在 vtable 中显示 Rank()。您的屏幕截图显示了 Employee 类的内容。

“是的,调试器没有足够的类型信息来判断数组的长度。因此它只显示第一个元素,除非被覆盖。”

http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/23d4e48e-520e-45b4-8c2f-65c11946d75d

  • 我正在声明一个指向 Manager 的指针,而不是指向 Employee 的指针。请查看完整代码。 (2认同)
  • 我不认为它会将其显示为 Employee 指针。您的屏幕截图中的类型是 Manager。它只是将包含的基类 Employee 对象显示为 Employee。看我上面的回答就知道原因了。您的 vtable 没有 Rank,因为 Manager 对象的 Rank 是直接调用,不涉及间接调用。然而,我确信 JuniorManager 在 vtable 中会有 Rank。 (2认同)