C++从基类调用派生类中的函数而不进行强制转换,也没有虚拟方法

Xaq*_*Xaq -1 c++ inheritance

我最近在接受采访时被问到这个问题:

#include <iostream>
class Base
{
public:
    void foo() { std::cout << "foo" << std::endl; }
};

class Derived : public Base
{
public:
    void bar() { std::cout << "bar" << std::endl; }
};

int main(int argc, const char *argv[])
{
    Base *p = new Derived;
    // additional code here
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题的条件是Base和Derived类无法更改(例如更改方法的名称,添加其他方法或将方法更改为virtual.进一步的限制是不能使用任何类型的强制转换.必须使用指针p.除此之外,您可以编写任何其他代码,包括必要的多个类,以确保使用p指向的对象调用"bar()"方法.

鉴于没有允许演员阵容,我能想到的唯一一个是老派的:

Derived *d;
memcpy(&d, &p, sizeof p);
d->bar();
Run Code Online (Sandbox Code Playgroud)

这比演员更糟糕.面试官骂我并告诉我,我甚至没有最基本的对象层次结构知识,因为我看不出这个问题的非常明显,微不足道的解决方案.

如果这个问题是重复,我道歉; 我已经看到了有关从基类访问派生类中的方法的其他问题,但在我看到的所有情况下,答案都涉及对任一类的强制转换或修改.

他可能是正确的; 我用C++编程超过15年,我看不到解决方案.可能是我从未遇到过它,因为在这种情况下我会使用强制转换:在这种情况下,它必须是static_cast,因为没有虚拟方法(甚至是析构函数)都不允许dynamic_vast编译(它失败并显示一条消息:"'Base'不是多态类型"

Luc*_*ore 6

简单而且 简单 哑:

#define Base Derived
Run Code Online (Sandbox Code Playgroud)

就在此之前main.(然后你可以打电话bar)

  • @chris回答它,然后站起来说"如果这是你做事的方式,我可能不适合这里":) (4认同)
  • 我只能说哇.我讨厌那个面试问题. (2认同)