如何检测一个类是否以多态方式使用?

时间:2014-09-03 01:48:41

标签: c++

假设在一个旧项目(> 1M行)中,有一个名为Base的类,它有两个虚函数foobar

class Base
{
public:
    virtual void foo();
    virtual void bar();
};

class Derived: public Base
{
public:
    virtual void foo();
    virtual void bar();
};

我怀疑Base未以多态方式使用,因此foo / bar不应该是虚拟的。

为了确认我的想法,我需要找出是否有如下声明:

Base *b = new Derived;

但是如果我们在函数中传递指针,就很难找到,例如:

Base *f()
{
  ...
  Derived *d = /* ... */;
  ...
  return d;
}

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:0)

如果你有两个类如下:

class Base
{
    virtual void a(){};
};

class Derived : public Base 
{
    virtual void b(){};
};

编写代码时:     Base * ptr = new Derived(); 你可以在观察窗口看到ptr

ptr->__vfptr    0x00eb5740 const Derived::`vftable' *
[0] 0x00eb1028 Base::a(void)    *

如果添加此辅助变量,则可以查看整个vtable:

void (**vt)() = *(void (***)())ptr;

在观察窗口中,您可以看到:

vt,2    0x00eb5740 const Derived::`vftable' void (void)* *
[0] 0x00eb1028 Base::a(void)    void (void)*
[1] 0x00eb10aa Derived::b(void) void (void)*

所以,你可以尝试一下。

答案 1 :(得分:0)

Derived私密地从Base继承。这将防止隐式向上转换使Base* b = new Derived;编译错误。