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
东西告诉我,大部分的问题可以通过实际做一些事情(如发送一个味精到stdout)在你的你的发布代码的成员,而不是与他们的右大括号结束他们回答埋在一行评论中。 – WhozCraig
并且不要静态转换指针。只需传递基类方法指针即可。如果虚拟继承设置正确([在这种情况下,它是](http://coliru.stacked-crooked.com/a/86071a262c7caef1)),派生成员将被触发。 – WhozCraig
我最初是在寻找一个不同的答案,但在中途解决了我自己的问题,决定改变问题,所以我明白你为什么发布该评论,但当时我的真实代码正在做一些事情,什么也没有发生。我可能可以通过一些实验来回答这个新问题,但我正在上班,已经输入了大部分帖子。 :)另外,我认为这是值得在网站上。你的第二个评论很棒,这是一个很好的工具。发布它作为答案,我会标记它,@WhozCraig –