在C++中进行转换操作后在子进程中使用虚函数

Ale*_*der 7 c++

我有以下代码:

class A
{
};

class B : public A
{
    public:
        virtual void f() {}
};

int main()
{
    A* a = new A();
    B* b = static_cast<B*>(a);
    b->f();
}
Run Code Online (Sandbox Code Playgroud)

该程序因分段错误而失败.有两种解决方案可以使这个程序工作:

  1. 声明f非虚拟
  2. 不要调用b-> f()(即它不会因为演员而失败)

但是,两者都不是一种选择.我认为这不起作用,因为在vtable中查找.

(在实际程序中,A也有虚函数.此外,在构造函数中不调用虚函数.)

有没有办法使这个程序工作?

Joe*_*Joe 12

你不能这样做,因为你创建的对象是A,而不是B.你的演员是无效的 - A的对象(用new创建)不能神奇地成为B的对象.

你是说A*a = new A()实际上是A*a = new B()?在那种情况下,我希望它能起作用.

  • 这可能是它自己的问题,但答案是(非虚拟)成员函数调用`b-> f()`在内部与`B :: f(b)`相同.换句话说,有一个名为`B :: f`的函数,它接受一个隐含的第一个参数,它是一个指向它被调用的对象的指针(该参数是`this`指针,用于访问成员有问题的对象).对于虚函数,事先不知道是调用`B :: f`还是`C :: f`,因此需要一个查找表,它使用`b`指针,是你的segfault来的地方从. (2认同)