C++ - 基类指针,方法指针,引用派生类,方法
C++ - Base class pointer, method pointer, refer to derived class, method?
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();
}
我的问题:
假设我有一个带有方法的派生类,我可以使用其基类型的指针引用该类的实例。假设我知道要调用什么方法,那么我可以通过该指针调用它,并且将调用派生类的方法。
当我通过提供方法指针指定要调用的方法时,如何实现类似的多态行为?
如果我强制转换方法指针,上面基于的真实代码将编译,但它似乎没有做任何事情—— 正是在这一点上,我意识到我没有调用 OtherClass 的更新方法,这就是为什么我没有得到任何快乐。 :D所以这有效,就像(几乎)一样。愚蠢,愚蠢的大脑。
然后稍微修正路线:现在我需要静态转换我传递给 OtherClass 的方法指针,当我将它传递给 Add 时,将其转换为指向基类方法的指针。这并不理想。
例如,如果我将 &(Base::Foo) 传递给方法 Add,我可以获得相同的行为吗?
如果我在指向引用派生类型实例的基类型的指针上调用该方法,是否会调用 Derived1::Foo?
我感觉它会打电话给基本成员。 :(
一些阅读:"向上转换"方法指针并将其与基类指针一起使用是否安全?C++继承和成员函数指针指向成员转换的指针将指向派生类方法的指针强制转换为指向基类的方法的指针
我相信您正在考虑如果在派生类中提供,虚拟基的 Member-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()
相关文章:
- 将一个类的方法指针存储到另一个类中
- 如何调用返回类方法指针的类方法
- 通过reinterpret_casting方法指针从指针调用派生类的方法。这是 UB 吗?
- 泛型方法指针.reinterpret_cast指向不同类的方法指针,这是 UB 吗?
- C++;类方法指针;λ;将 lambda 作为成员函数指针传递;
- 使用模板、方法指针和字符串键入推导
- 将方法指针作为整数参数发送到C#的C 方法
- 从C 中的VTable获取方法指针
- 模板化方法指针 - 无法匹配函数参数的指针
- 获取特定的模板重载方法指针
- 如何将方法指针声明为Typedef方法参数
- 如何将方法指针类型转换为函数指针类型
- 如何在使用 pthreads 时将方法指针作为函数参数传递C++
- 方法指针映射,编译器说他们不接受任何参数
- C# 方法指针,如 C++ 中的指针
- c++创建新的LinkedList类:Clear()方法指针被释放未分配
- 尝试获取类方法指针时出现E_NOINTERFACE
- 传递和强制转换方法指针
- 常量方法指针的类型是什么
- 将对象的方法指针传递给接受 [静态方法指针/全局函数] 指针的函数