2014-04-01 194 views
1
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(); 
} 

我的问题:C++ - 基类指针,方法指针,引用派生类,方法?

说我有一个方法的派生类,我指的是类的一个实例与它的指针的基本类型。假设我知道我想调用什么方法,那么我可以通过该指针调用它,派生类的方法将被调用。

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

上面的实际代码基于将编译如果我施放方法指针,但它似乎没有做任何 - 在这一点上,我已经意识到我没有调用OtherClass的更新方法,它这就是为什么我没有得到任何喜悦。 :D所以这个工作,就像(几乎)。愚蠢,愚蠢的大脑。

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

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

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

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

一些阅读: Is it safe to "upcast" a method pointer and use it with base class pointer? C++ inheritance and member function pointers Pointer to member conversion Casting a pointer to a method of a derived class to a pointer to a method of a base class

+0

东西告诉我,大部分的问题可以通过实际做一些事情(如发送一个味精到stdout)在你的你的发布代码的成员,而不是与他们的右大括号结束他们回答埋在一行评论中。 – WhozCraig

+0

并且不要静态转换指针。只需传递基类方法指针即可。如果虚拟继承设置正确([在这种情况下,它是](http://coliru.stacked-crooked.com/a/86071a262c7caef1)),派生成员将被触发。 – WhozCraig

+0

我最初是在寻找一个不同的答案,但在中途解决了我自己的问题,决定改变问题,所以我明白你为什么发布该评论,但当时我的真实代码正在做一些事情,什么也没有发生。我可能可以通过一些实验来回答这个新问题,但我正在上班,已经输入了大部分帖子。 :)另外,我认为这是值得在网站上。你的第二个评论很棒,这是一个很好的工具。发布它作为答案,我会标记它,@WhozCraig –

回答

0

我相信你在琢磨一个虚基类成员-FN-PTR是否将触发多态性推导覆盖,如果在派生类中提供如果是这样,答案是肯定的,下面的代码演示了这一点。

希望这有助于。

#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() 
相关问题