C 方法指向Overriden方法
C++ method pointer to overriden method
我最近完成了一些我希望能够按照我的期望的方式工作的程序,事实证明,它确实如此!这是情况:
我有一个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::handle
是virtual
?
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- 访问C 中的Overriden Parent虚拟方法
- C 方法指向Overriden方法
- 从另一种基本方法调用Overriden方法
- C++在作为超类传递后使用overriden方法
- 在C++中将overriden类方法作为链调用
- 使用std::thread从派生类中调用overriden方法