其他分享
首页 > 其他分享> > c – 使用基类函数指针访问派生类成员函数

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

作者:互联网

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

error C2440: ‘=’ : cannot convert from ‘void (__thiscall ClassB::*
)(void)’ to ‘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;
}

我的问题是

> C行为是否通过基类函数指针或其编译器错误无法访问派生类函数?
>我一直在玩上面的情况,如果我注释掉ClassB :: foo,这段代码编译得很好,没有任何进一步的修改,为什么会这样,不应该fPtr =& ClassB :: foo;再次导致编译时错误?

解决方法:

>这是正确的行为.可以这样想:ClassB的所有实例都有成员ClassA :: foo,但并非所有ClassA实例都有成员ClassB :: foo;只有那些实际上是ClassB实例的基类子对象的ClassA实例才有它.因此,将ClassB :: foo分配给ClassAFoo然后将ClassAFoo与“纯”ClassA对象结合使用将尝试调用不存在的函数.
>如果从ClassB中删除foo,则表达式ClassB :: foo实际上是指在ClassB中继承的ClassA :: foo,因此没有问题.

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

标签:c,visual-c,visual-studio-2005
来源: https://codeday.me/bug/20190725/1534868.html