C++ C++;-基类指针,方法指针,引用派生类,方法?

C++ C++;-基类指针,方法指针,引用派生类,方法?,c++,pointers,C++,Pointers,我的问题: 假设我有一个带有方法的派生类,我可以使用该类的基类型指针引用该类的实例。假设我知道要调用什么方法,那么我可以通过该指针调用它,然后将调用派生类的方法 当我通过提供方法指针指定要调用的方法时,如何实现类似的多态行为 如果我抛出方法指针,上面所基于的真正代码将编译,但它似乎没有做任何事情——在这一点上,我意识到我没有调用其他类的update方法,这就是我没有得到任何乐趣的原因因此,这是可行的,因为是(几乎)。愚蠢的,愚蠢的大脑 然后稍微纠正一下:现在我需要静态转换我传递给OtherCla

我的问题:

假设我有一个带有方法的派生类,我可以使用该类的基类型指针引用该类的实例。假设我知道要调用什么方法,那么我可以通过该指针调用它,然后将调用派生类的方法

当我通过提供方法指针指定要调用的方法时,如何实现类似的多态行为

如果我抛出方法指针,上面所基于的真正代码将编译,但它似乎没有做任何事情——在这一点上,我意识到我没有调用其他类的update方法,这就是我没有得到任何乐趣的原因因此,这是可行的,因为是(几乎)。愚蠢的,愚蠢的大脑

然后稍微纠正一下:现在我需要静态转换我传递给OtherClass的方法指针,当我传递给Add时,转换为基类方法的指针。这并不理想

例如,如果我将&(Base::Foo)传递给Add方法,是否可以获得相同的行为

如果我在指向引用派生类型实例的基类型的指针上调用该方法,会调用Derived1::Foo吗

我感觉它会打电话给基地成员(

一些阅读:

我相信您正在考虑,如果派生类中提供了多态派生重写,虚拟基的成员fn ptr是否会触发多态派生重写。如果是,答案是肯定的,下面的代码演示了这一点

希望这有帮助

class Base
{
    virtual void Foo(){}
    virtual void Bar(){}
};

class Derived1 : public Base
{
    void Foo(){ //Do something }
    void Bar(){ //Do something }
}

class Derived2 : public Base
{
    void Foo(){ //Do something }
    void Bar(){ //Do something }
}

class OtherClass
{
public:
    Base* obj;
    void (Base::*method)();

    void Add( Base* _obj, void (Base::*_method)() )
    {
        obj = _obj;
        method = _method;
    }

    void Run()
    {
        ( obj->method )();
    }
}

int main()
{
    Derived1 d1;
    Derived2 d2;

    OtherClass other;

    other.Add( &d1, &(Derived1::Foo) );
    //other.Add( &d2, &(Derived2::Bar) ); etc, etc.

    other.Run();
}

有些事情告诉我,你的大部分问题都可以通过实际行动来回答(比如向stdout发送消息)在您发布的代码的成员中,而不是在它们的结束处使用隐藏在单行注释中的右大括号。并且不要静态强制转换指针。只需传递基类方法指针。如果虚拟继承设置正确,将触发派生成员()。我最初在寻找一个不同的答案,但中途解决了我自己的问题,决定更改问题,因此我理解你为什么发布了该评论,但当时我的真实代码正在做一些事情,而什么也没有发生。我可能可以通过一些实验来回答新问题,但我正在工作d已经把大部分帖子打印出来了。另外,我认为在这个网站上发布是值得的。你的第二条评论很好,这是一个很好的工具。把它作为答案贴出来,我会记下来,@WhozCraigOh,那好。我没有把它作为一个答案,因为我不确定这是你期待的。i、 e.通过虚拟基成员的成员fn ptr将触发相应的派生成员。我希望那就是你要去的地方。是的,Coliru和Ideone在即兴代码剪接方面都很出色。这里经常使用这两种语言。
#include <iostream>

class Base
{
public:
    virtual void Foo()
    {
        std::cout << __PRETTY_FUNCTION__ << '\n';
    }
    virtual void Bar()
    {
        std::cout << __PRETTY_FUNCTION__ << '\n';
    }
};

class Derived1 : public Base
{
public:
    void Foo()
    {
        std::cout << __PRETTY_FUNCTION__ << '\n';
    }

    void Bar()
    {
        std::cout << __PRETTY_FUNCTION__ << '\n';
    }
};

class Derived2 : public Base
{
public:
    void Foo()
    {
        std::cout << __PRETTY_FUNCTION__ << '\n';
    }

    void Bar()
    {
        std::cout << __PRETTY_FUNCTION__ << '\n';
    }
};

class OtherClass
{
public:
    Base* obj;
    void (Base::*method)();

    void Add( Base* _obj, void (Base::*_method)() )
    {
        obj = _obj;
        method = _method;
    }

    void Run()
    {
        (obj->*method)();
    }
};

int main()
{
    Derived1 d1;
    Derived2 d2;

    OtherClass other;

    other.Add( &d1, &Base::Foo );
    other.Run();

    other.Add( &d2, &Base::Bar);
    other.Run();
}
virtual void Derived1::Foo()
virtual void Derived2::Bar()