C++ 继承成员函数指针
我在网上看到了这段代码,我想知道它是如何实现的。由于成员函数指针不能分配给基类的成员函数指针,我很好奇派生类的成员函数指针存储在哪里以及如何存储 这是带有测试声明的头文件C++ 继承成员函数指针,c++,pointers,c++11,function-pointers,member-function-pointers,C++,Pointers,C++11,Function Pointers,Member Function Pointers,我在网上看到了这段代码,我想知道它是如何实现的。由于成员函数指针不能分配给基类的成员函数指针,我很好奇派生类的成员函数指针存储在哪里以及如何存储 这是带有测试声明的头文件 #ifndef TestStudent_h #define TestStudent_h #include <iostream> #include <string> // Note 1 #include "TestCase.h" #include "TestSuite.h" #include "Tes
#ifndef TestStudent_h
#define TestStudent_h
#include <iostream>
#include <string>
// Note 1
#include "TestCase.h"
#include "TestSuite.h"
#include "TestCaller.h"
#include "TestRunner.h"
#include "Student.h"
class StudentTestCase : public TestCase { // Note 2
public:
// constructor - Note 3
StudentTestCase(std::string name) : TestCase(name) {}
// method to test the constructor
void testConstructor();
// method to test the assigning and retrieval of grades
void testAssignAndRetrieveGrades();
// method to create a suite of tests
static Test *suite ();
};
#endif
我想知道成员函数存储在什么数据类型中,因为它们不能存储在基类已知的任何函数指针类型中。。此外,它们的存储位置必须知道它们所定义的类的类型,因为调用这些对象的任何实体都需要将这些函数与该类型的对象“链接”起来,对吗?特别是在这个函数中,
TestCaller
如何知道如何调用添加到其中的成员函数?我猜,TestCaller
有一个
template<class Callee>
TestCaller(
const std::string &description,
void (Callee::*test_method)());
模板
测试调用方(
常量标准::字符串和描述,
无效(被调用方::*测试方法)();
请注意:
被调用方的类型是已知的
TestCaller
本身必须以不“知道”被调用方的方式存储test\u方法
,因为它本身不是被调用方参数化的模板类(事实上,可能不止一个被调用方
)boost::any
)
其思想是
TestCaller
存储(可能间接地)指向非模板基类的指针。存在派生类的模板版本。在这个模板化的ctor中,派生类被实例化,这种类型的对象被动态分配。存储的是指向非模板基类的指针。我猜TestCaller
有一个
template<class Callee>
TestCaller(
const std::string &description,
void (Callee::*test_method)());
模板
测试调用方(
常量标准::字符串和描述,
无效(被调用方::*测试方法)();
请注意:
被调用方的类型是已知的
TestCaller
本身必须以不“知道”被调用方的方式存储test\u方法
,因为它本身不是被调用方参数化的模板类(事实上,可能不止一个被调用方
)boost::any
)
其思想是
TestCaller
存储(可能间接地)指向非模板基类的指针。存在派生类的模板版本。在这个模板化的ctor中,派生类被实例化,这种类型的对象被动态分配。存储的是指向非模板基类的指针。@n.m.但它们需要存储在某个地方?不涉及基类,TestSuite。对不起,我想我不明白你在问什么。成员函数不是“存储”在任何地方,它们只是存储在任何地方。成员函数指针存储在其特定的数据类型中。它们是没有任何结构的原始数据类型。@kfsone那么TestSuite如何知道如何调用这些函数呢?它们必须与类型为StudentTestCase
的对象链接,对吗?@Downvoter为什么是downvote?@n.m.但它们需要存储在某个地方?不涉及基类,TestSuite。对不起,我想我不明白你在问什么。成员函数不是“存储”在任何地方,它们只是存储在任何地方。成员函数指针存储在其特定的数据类型中。它们是没有任何结构的原始数据类型。@kfsone那么TestSuite如何知道如何调用这些函数呢?它们必须与类型为StudentTestCase
的对象链接,对吗?@Downvoter为什么要进行downvote?@quistival:-)当我第一次看到这种技术时(在一些序列化库中),我非常高兴。但是在代码中,调用new
操作符时没有模板参数。。那么这真的会起作用吗?哦,不可能,函数被添加到TestCaller
类中。谢谢@好奇:-)当我第一次(在一些序列化库中)看到这种技术时,我非常高兴。但是在代码中,new
操作符在没有模板参数的情况下被调用。。那么这真的会起作用吗?哦,不可能,函数被添加到TestCaller
类中。谢谢