假设在一个旧项目(> 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;
}
有没有办法做到这一点?
答案 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;
编译错误。