C++ 如何在多态性中强制隐式转换? 请考虑这个例子, 如何在第二个参数是指向成员函数的指针的函数中强制隐式转换。 在函数的参数列表中显式转换不是我现在想要实现的。 相反,我希望编译器能像处理第一个参数一样 struct Base { virtual ~Base() = 0 {} }; struct Derived : public Base { void f(){} }; typedef void(Base::*polymorph)(); // how do I force IMPLICIT conversion here: EDIT: (polymorph type work only for polymorph pointer type no conversion) void func(Base* arg1, polymorph arg2) // void* arg2, (void*) arg2 etc... dosn't work { polymorph temp = reinterpret_cast<polymorph>(arg2); // to achive this } int main() { Derived* test = new Derived; // first parameter work but another gives an error func(test, &Derived::f); // BY NOT CHANGING THIS! delete test; return 0; } struct Base { 虚拟~Base()=0{} }; 结构派生:公共基 { void f(){} }; typedef void(基::*多晶型)(); //如何在此处强制隐式转换:编辑:(变形类型仅适用于变形指针类型无转换) void func(基*arg1,变形arg2)//void*arg2,(void*)arg2等。。。不行 { polymorph temp=reinterpret_cast(arg2);//要实现这一点 } int main() { 派生*测试=新派生; //第一个参数起作用,但另一个参数给出错误 func(test,&派生::f);//通过不更改此参数! 删除测试; 返回0; }
尽可能干净。代码如下。但我不知道在实际调用“temp”时,将引用谁的“this”指针C++ 如何在多态性中强制隐式转换? 请考虑这个例子, 如何在第二个参数是指向成员函数的指针的函数中强制隐式转换。 在函数的参数列表中显式转换不是我现在想要实现的。 相反,我希望编译器能像处理第一个参数一样 struct Base { virtual ~Base() = 0 {} }; struct Derived : public Base { void f(){} }; typedef void(Base::*polymorph)(); // how do I force IMPLICIT conversion here: EDIT: (polymorph type work only for polymorph pointer type no conversion) void func(Base* arg1, polymorph arg2) // void* arg2, (void*) arg2 etc... dosn't work { polymorph temp = reinterpret_cast<polymorph>(arg2); // to achive this } int main() { Derived* test = new Derived; // first parameter work but another gives an error func(test, &Derived::f); // BY NOT CHANGING THIS! delete test; return 0; } struct Base { 虚拟~Base()=0{} }; 结构派生:公共基 { void f(){} }; typedef void(基::*多晶型)(); //如何在此处强制隐式转换:编辑:(变形类型仅适用于变形指针类型无转换) void func(基*arg1,变形arg2)//void*arg2,(void*)arg2等。。。不行 { polymorph temp=reinterpret_cast(arg2);//要实现这一点 } int main() { 派生*测试=新派生; //第一个参数起作用,但另一个参数给出错误 func(test,&派生::f);//通过不更改此参数! 删除测试; 返回0; },c++,inheritance,C++,Inheritance,尽可能干净。代码如下。但我不知道在实际调用“temp”时,将引用谁的“this”指针 typedef void(Base::*polymorph)(); void func(Base* arg1, polymorph arg2) { polymorph temp = arg2; } int main() { Derived* test = new Derived; // first parameter work but another gives an
typedef void(Base::*polymorph)();
void func(Base* arg1, polymorph arg2)
{
polymorph temp = arg2;
}
int main()
{
Derived* test = new Derived;
// first parameter work but another gives an error
func(test, static_cast<polymorph>(&Derived::f));
delete test;
return 0;
}
typedef void(基::*polymorph)();
void func(基*arg1,变形arg2)
{
多晶型温度=arg2;
}
int main()
{
派生*测试=新派生;
//第一个参数起作用,但另一个参数给出错误
func(测试、静态转换和派生::f));
删除测试;
返回0;
}
我怀疑这是做不到的。在func中,您只知道(静态地)您正在处理一个基本对象,假装任何基本对象都有该方法是不安全的。-此外,仅仅因为涉及到一个指针,并不意味着您必须使用new/delete
:派生测试;func(&测试,&派生::f)这个问题不够清楚。请解释一下。我希望能够将一个指向成员方法的指针赋给函数参数,该函数参数采用指向成员参数的指针。在我的示例中,函数应该采用“polimorph”类型,但它不会。如果这是您想要的,只需将其设置为模板:template void func(Base*,void(T:*)();`但问题仍然是,你将如何处理函数指针。是的,模板很好!,我已经考虑过了。如果有别的办法的话,我只是在讨好。谢谢。谢谢您的努力,但是第二个参数正在使用static_cast进行显式转换,但不是像我预期的那样隐式转换。我想在函数main中实现这一点,而不需要强制转换操作符。取而代之的是,铸造操作员应该被其他人使用。但是这是不可能的,不是吗?@codekiddy-这与您不能将指向基类的指针隐式转换为指向派生类的指针的原因相同。除此之外,通过“temp”调用派生的::f怎么可能安全呢?什么对象将调用temp及其类型?如果答案是“一个基本实例”,那么假设类型安全是一个巨大的飞跃。让我问这个问题:“你到底想做什么?”如果我的团队中有人试图用指向成员函数的指针来做一些不正常的事情,我们可能会一起白板一个更好的设计,包括接口和虚拟方法。我曾经尝试过的不再是问题,因为我已经放弃了。谢谢你的时间!