是覆盖返回类型所需的指针-继承



如果我有一个基类Attribute,它有一个名为clone的方法,它返回Attribute,但它的子类Direction在返回Direction时得到错误。

Attribute Attribute::clone() {
    if(this->currentValue) {
        return Attribute(this->type, this->currentValue);
    } else if (!this->param.empty()) {
        return Attribute(this->type, this->param);
    } else {
        return Attribute();
    }
}

Direction Direction::clone() {
    if(this->currentValue) {
        return Direction(this->type, this->currentValue);
    } else if (!this->param.empty()) {
        return Direction(this->type, this->param);
    } else {
        return Direction();
    }
}

虽然,当它们都返回指向新Attribtue的指针时,它可以工作。(即return new Attribtue();, return new Direction();)。返回值必须是指向Attribtue的指针吗?


EDIT:以下是类:

class Attribute {
public:
std::string param;
std::string type;
float currentValue;
Attribute(std::string type = "absolute", float value = 0);
Attribute(std::string type, std::string param);
~Attribute();
virtual Attribute clone();
};
class Direction : public Attribute{
public:
Direction(std::string type = "absolute", float value = 0);
Direction(std::string type, std::string param);
~Direction();
Direction clone();
};

c++支持原始指针和原始引用的协变函数结果,但不支持其他类型。

这包括智能指针不支持协变结果。

但是你可以很容易地绕过智能指针的语言限制,例如

class Base
{
private:
    virtual
    auto virtual_clone() const
        -> Base* 
    { return new Base( *this ); }
public:
    auto clone() const
        -> std::unique_ptr<Base>
    { return std::unique_ptr<Base>( virtual_clone() ); }
};
class Derived
    : public Base
{
private:
    auto virtual_clone() const
        -> Derived*                // Covariant is OK here. 
        override
    { return new Derived( *this ); }
public:
    auto clone() const
        -> std::unique_ptr<Derived>
    { return std::unique_ptr<Derived>( virtual_clone() ); }
};

免责声明:代码不会被编译器接触。

注意,在这个智能指针的例子中,unique_ptr<Derived>而不是 unique_ptr<Base>的派生类,但是提供了一个值转换到后者。


那么,关于题目,

是否需要指针来覆盖返回类型-继承?

基本的答案是否定的,你可以让非指针也工作,比如智能指针实例,但只有对概念上类似指针的东西才有意义。

只是重复这个答案的开头一句话,在语言层面上,c++支持原始指针和原始引用的协变函数结果,但不支持其他类型。

相关内容

  • 没有找到相关文章

最新更新