C++ 如何检测类是否以多态方式使用?
假设在一个旧项目中(>1M行),有一个名为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不应该是虚拟的 为了证实我的想法,我需要
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???