使用基类函数指针访问派生类成员函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用基类函数指针访问派生类成员函数相关的知识,希望对你有一定的参考价值。

我在我的项目中使用函数指针,面临问题,创建了一个测试用例来显示它...下面的代码失败,MSVC2005上面有以下错误(简单来说我想通过基类函数指针访问dervied类函数)

错误C2440:'=':无法从'void(__ thiscall ClassB :: *)(void)'转换为'ClassAFoo'

class ClassA {
 public: 
    virtual void foo() 
    {
       printf("Foo Parent"); 
    }
};

typedef void (ClassA::*ClassAFoo)();

class ClassB : public ClassA {
 public:
    virtual void foo() 
    { 
        printf("Foo Derived"); 
    }
};

int main() {
    ClassAFoo fPtr;
    fPtr = &ClassB::foo;
}

我的问题是

  1. 是不是C ++行为,我无法通过基类函数指针或其编译器错误访问派生类函数?
  2. 我一直在玩上面的情况,如果我注释掉ClassB::foo,这段代码编译好了,没有任何进一步的修改,为什么这样,不应该fPtr = &ClassB::foo;再次导致编译时错误?
答案
  1. 这是正确的行为。可以这样想:ClassB的所有实例都有成员ClassA::foo,但并非所有ClassA实例都有成员ClassB::foo;只有那些实际上是ClassA实例的基类子对象的ClassB实例才有它。因此,将ClassB::foo分配到ClassAFoo然后将ClassAFoo与“纯”ClassA对象结合使用会尝试调用不存在的函数。
  2. 如果你从qazxsw poi中删除foo,表达式qazxsw poi实际上是指ClassB继承的ClassB::foo,所以那里没有问题。

详细说明1.指向成员的指针实际上与普通指针的工作方式相反。使用普通指针,您可以将ClassA::foo分配到ClassB(因为ClassB*的所有实例也是ClassA*的实例),但反之亦然。使用成员指针,您可以将ClassB分配到ClassA(因为ClassA::*包含ClassB::*的所有成员),但反之亦然。

另一答案

好的,可以。你不能分配ClassBClassA函数指针的函数指针。你可以这样做

class A

并且将调用在class B函数中重写。

当在fPtr = &ClassA::foo; ClassB b; classA* a = &b; (a->*fPtr)(); 中没有函数ClassB时,将使用foo的函数。 ClassB

另一答案

首先,我不是C ++专家(我正在努力学习C ++)。如果我错了,请纠正我,这是一个实验。

作为学习成员函数指针的一部分,我还在搜索使用基本成员函数指针调用派生成员的代码示例。经过这个线程之后,我创建了一个代码示例,即使成员函数不是虚函数,它也可以调用派生成员函数。

我正在使用代理人充当祈求者。我希望它对某些人有帮助。 (纠正我,如果我做错了什么)

ClassA

输出:

delegate.Invoke()将调用Derived :: SimpleMethod(),输出将为“Derived :: SimpleMethod”**

以上是关于使用基类函数指针访问派生类成员函数的主要内容,如果未能解决你的问题,请参考以下文章

如果基类指针不能访问派生类成员函数,那么多态有啥方便呢?

为啥我可以通过指向派生对象的基类指针访问派生私有成员函数?

基类与派生类的指针和成员函数调用原理

在 C++ 中将指向基类的指针传递给派生类的成员函数

6多态性-3虚函数

基类指针指向派生类对象&派生类指针指向基类对象