C++ C++;-基类指针,方法指针,引用派生类,方法?
我的问题: 假设我有一个带有方法的派生类,我可以使用该类的基类型指针引用该类的实例。假设我知道要调用什么方法,那么我可以通过该指针调用它,然后将调用派生类的方法 当我通过提供方法指针指定要调用的方法时,如何实现类似的多态行为 如果我抛出方法指针,上面所基于的真正代码将编译,但它似乎没有做任何事情——在这一点上,我意识到我没有调用其他类的update方法,这就是我没有得到任何乐趣的原因因此,这是可行的,因为是(几乎)。愚蠢的,愚蠢的大脑 然后稍微纠正一下:现在我需要静态转换我传递给OtherClass的方法指针,当我传递给Add时,转换为基类方法的指针。这并不理想 例如,如果我将&(Base::Foo)传递给Add方法,是否可以获得相同的行为 如果我在指向引用派生类型实例的基类型的指针上调用该方法,会调用Derived1::Foo吗 我感觉它会打电话给基地成员( 一些阅读:C++ C++;-基类指针,方法指针,引用派生类,方法?,c++,pointers,C++,Pointers,我的问题: 假设我有一个带有方法的派生类,我可以使用该类的基类型指针引用该类的实例。假设我知道要调用什么方法,那么我可以通过该指针调用它,然后将调用派生类的方法 当我通过提供方法指针指定要调用的方法时,如何实现类似的多态行为 如果我抛出方法指针,上面所基于的真正代码将编译,但它似乎没有做任何事情——在这一点上,我意识到我没有调用其他类的update方法,这就是我没有得到任何乐趣的原因因此,这是可行的,因为是(几乎)。愚蠢的,愚蠢的大脑 然后稍微纠正一下:现在我需要静态转换我传递给OtherCla
我相信您正在考虑,如果派生类中提供了多态派生重写,虚拟基的成员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()