为什么这是不合法的:
class Base
{
public:
Base(){};
virtual ~Base(){};
};
class Derived : public Base{};
void takeDerived(Derived * c){};
// main
void(*ptr)(Base*) = static_cast<void(*)(Base*)>(&takeDerived); // doesn't work
// but this work ok, as well as reinterpret_cast
// void(*ptr)(Base*) = (void(*)(Base*))(&takeDerived);
Derived
是一个Base
。为什么不能在函数参数中进行转换?例如,即使没有转换,我也可以轻松地做到这一点:
void takeBase(Base* c){};
takeBase(new Derived{});
最佳答案
它就是这样设计的。 Base
不是 Derived
。类派生的 is-a 关系无法逆转。
函数参数的类型意味着“接受”,而对象的类型意味着“适合”。转换函数的类型会改变它接受的内容。允许一个函数接受任何不是它最初接受的东西是危险的。
考虑这段代码:
class Base {};
class Derived : public Base {
public:
int t;
void useDerived() {}
};
void useDerived(Derived *d){
d->useDerived();
}
如果传递了一个 Base
对象会发生什么?
Base b;
((void(*)(Base*))useDerived) (&b);
更糟糕的是,如果传递了 Base
的另一个推导怎么办?
class AnotherDerived : public Base {
public:
double t;
void useDerived() {}
};
AnotherDerived ad;
((void(*)(Base*))useDerived) (&ad);
关于c++ - 转换因参数类型而异的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27132333/