如果我有一个基类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++支持原始指针和原始引用的协变函数结果,但不支持其他类型。