Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 继承成员函数指针_C++_Pointers_C++11_Function Pointers_Member Function Pointers - Fatal编程技术网

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
    类中。谢谢