C++ 如何检测类是否以多态方式使用?

C++ 如何检测类是否以多态方式使用?,c++,C++,假设在一个旧项目中(>1M行),有一个名为Base的类,它有两个虚拟函数foo和bar class Base { public: virtual void foo(); virtual void bar(); }; class Derived: public Base { public: virtual void foo(); virtual void bar(); }; 我怀疑Base不是多态使用的,因此foo/bar不应该是虚拟的 为了证实我的想法,我需要

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

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

有什么方法可以做到这一点吗?

如果您有以下两个类:

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

class Derived : public Base 
{
    virtual void b(){};
};
编写代码时: Base*ptr=新派生的(); 你们可以在手表窗口看到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)*

因此,您可以试一试。

使
派生
Base
私下继承。这将防止隐式向上转换,使
Base*b=new-Derived编译错误。

您不太可能找到一种100%准确率的方法。首先想到的是将
Base
设置为私有基(这可以防止在没有C样式转换的情况下从
派生*
转换为
基*
)并查看代码是否编译。您还可以将
Base::foo
设置为纯虚拟函数,让编译器检测函数是否以多态方式使用。@T.C.谢谢!这就是我要找的。OP正在寻找一种查找类似
Base*ptr=new-Derived()
的代码的方法,但您的答案需要先找到它,然后检查vtable???