用c ++重写转换操作

时间:2016-04-01 11:04:31

标签: c++ inheritance casting

在下面给出的代码中,当使用参数 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);
}

2 个答案:

答案 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);
}