在下面给出的代码中,当使用参数 d (派生类型)调用 func 方法时,它会被转换为 base& 。我想知道是否可以覆盖此强制转换操作。我希望在我的程序中发生这种特定的转换时调用一些操作。有可能吗?
class base{};
class derived : public base{
int a;
};
int func(base &a){
printf("Conversion from derived to base&", &a);
}
int main(){
derived d;
func(d);
}
答案 0 :(得分:1)
派生到基本转换不是演员。
演员表是表达转换的表示法。
如果您希望函数只接受特定类型的参数,则可以将其设为模板,并使用SFINAE,如std::enable_if
。除此之外(它不总是适用)你通常不能压制派生到基础。但是您可以删除派生类关系。
答案 1 :(得分:1)
您可以为派生&提供func的重载。像这样:
#include <cstdio>
class base{};
class derived : public base{
int a;
};
int func(base &a){
printf("Conversion from derived to base&\n");
return 0;
}
int func(derived &a){
printf("called with derived&\n");
// defer to the base version if you wish
return func(static_cast<base&>(a));
}
int main(){
derived d;
func(d);
}
但它的风格很差而且很脆弱(对于derived2,或者当有人定义它们时,它们不会工作)。
更正确(阅读:可维护,优雅,并且可能会阻止您的同事厌恶您)风格将封装基础/派生层次结构中的虚拟方法中的不同操作。然后自由函数(作用于base&amp;)延伸到base的接口,并允许派生类自己处理:
#include <cstdio>
class base{
public:
int func() {
return handle_func();
}
protected:
virtual int handle_func() {
printf("base&\n");
return 0;
}
};
class derived : public base{
int a;
private:
virtual int handle_func() override {
printf("derived&\n");
return base::handle_func();
}
};
int func(base &a){
return a.func();
}
int main(){
derived d;
func(d);
}