C 方法指向Overriden方法

C++ method pointer to overriden method

本文关键字:方法 Overriden      更新时间:2023-10-16

我最近完成了一些我希望能够按照我的期望的方式工作的程序,事实证明,它确实如此!这是情况:

我有一个Handler类是基类:

class Handler
{
public:
    Handler();
    virtual ~Handler();
    virtual void handle(SOCKET socket);
protected:
    virtual void doWork(SOCKET socket);

private:
    std::thread * handlerThread;
    static void processData(SOCKET socket);
};

我有一个PrintHandler,它是Handler的子类:

class PrintHandler : public Handler
{
public:
    PrintHandler();
    ~PrintHandler();
protected:
    virtual void doWork(SOCKET socket);
};

这是基类Handler和子类PrintHandler中的Dowork的定义:

void Handler::doWork(SOCKET socket)
{
    std::cerr << "If you see this, you didn't override the doWork function" << std::endl;
}
void PrintHandler::doWork(SOCKET socket)
{
    std::cerr << "This is in the base class" << std::endl;
}

当我创建指向PrintHandler的指针并将其施放到Handler的指针中,并通过方法指针在该对象上调用handle方法:

void Handler::handle(SOCKET socket)
{
    handlerThread = new std::thread(&Handler::doWork, this, socket);
}

doWork用作覆盖基类方法的子类方法。当我以自己的方式覆盖一种方法时,是否替换了内存中的基类方法?无论如何是否可以调用原始的基类Dowork方法?使用方法指针更改调用哪种方法被调用?

在此线程中,它为您提供了从子类中进行操作的方法。我将如何从基类中调用原始基类方法,在内存中,对象的实际结构是什么样的?

我了解这可能是很多值得回答的,因此,如果您可以在第一段中提供有关问题的知识,并建议在第二段中阅读一些问题,我认为这是最合适的。

谢谢!

当我以自己的方式覆盖一种方法时,它是否替换了内存中的基类方法?

否,这两个函数仍然存在。覆盖会影响特定对象时选择哪个版本;该类型的对象或其他不覆盖它的派生类仍需要基本版本。

无论如何是否有原始的基类陶库方法?

是的,您可以非虚假地称其为:

Handler::doWork();

使用方法指针更改来调用哪种方法被调用?

否,无论您直接调用该函数,还是通过指针到成员的字样选择相同的覆盖。它仅取决于被调用的对象的动态类型。

内存中对象的实际结构是什么样的?

这取决于实施。通常,该对象包含一个指针(称为A vptr 虚拟指针)到某些特定类别的元数据,其中包含一个针对虚拟函数的指针表(称为A vtable )。当您(虚拟)调用虚拟函数时,它会在该表中查找要调用的函数。指向虚拟函数的指针将指定要使用的表条目,而不是要调用哪个函数,以便虚拟调度仍然可以在任何覆盖该功能的类型上工作。

std::thread(&Handler::doWork, this, socket);

您实际上要求致电this->doWork(socket)

您可以创建一种其他方法,该方法几乎可以调用您的虚拟方法。AS:

void Handler::callHandlerDoWork(SOCKET socket)
{
    Handler::doWork(socket); /* no virtual call */
}
void Handler::handle(SOCKET socket)
{
    handlerThread = new std::thread(&Handler::callHandlerDoWork, this, socket);
}

注意:您真的需要Handler::handlevirtual