gpt4 book ai didi

c++ - 如何从派生类中的基类调用运算符?

转载 作者:太空狗 更新时间:2023-10-29 21:01:03 25 4
gpt4 key购买 nike

如何从其基类Vect的派生类nVect中调用operator*?

class Vect
{

protected:
int v1_;
int v2_;
int v3_;

public:
Vect( int v1, int v2, int v3 );
Vect( const Vect &v);
~Vect();
friend const Vect operator*(Vect& v, int n);
friend const Vect operator*(int n, Vect& v);
};


class nVect : public Vect
{
//private
int pos_;
int value_;

void update();

public:
nVect(int v1, int v2, int v3, int pos, int value);
nVect(const Vect & v, int pos, int value);
~nVect();

friend const nVect operator*(nVect& v, int n);
friend const nVect operator*(int n, nVect& v);
};

现在,编译器在以下代码行报错:

const nVect operator*(nVect& v, int n)
{
return nVect(Vect::operator*(v, n), v.pos_, v.value_);
}

错误:‘operator*’不是‘Vect’的成员。

怎么了?

谢谢大家!乔纳斯

最佳答案

它是一个自由函数,声明为 Vectfriend,而不是 Vect 的成员函数(即使它看起来 类似于在类中定义的成员函数,但这在这里并不重要,请参阅 FAQ 了解更多信息)。你需要

const nVect operator*(nVect& v, int n)
{
return nVect(static_cast<Vect&>(v)*n, v.pos_, v.value_);
}

也就是说,为 operator* 使用非常量引用是很奇怪的,因为如果您修改参数,调用者通常会非常惊讶。此外,没有理由返回 const 值,因此我建议您将签名更改为:

nVect operator*(const nVect& v, int n)
{
return nVect(static_cast<const Vect&>(v)*n, v.pos_, v.value_);
}

(同样适用于 Vect::operator*)

关于c++ - 如何从派生类中的基类调用运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19744050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com