2012-04-19 53 views
3

如何在基类中实现操作符重载,以获得派生类对象的基类部分?我该如何在基类中实现对派生类对象的基类部分的操作符重载?

请参见本文的示例代码并实现基类部分来实现对派生类对象*操作

class base { 
    int x; 
public: 

}; 

class der : public base { 
    int y; 
public: 
    const der operator*(const der& rh) { 
     der d; 
     d.y = y * rh.y; 
     return d; 
    } 

}; 
+0

@MikeSeymour:对我来说,'operator *'实现似乎只改变了在函数内部构造的单个值'd'。它不会修改'rh'和'* this'。 – 2012-04-19 10:25:53

+0

@FrerichRaabe:你说的对,我误解了;我只是看到它不是'const',而是掩盖了其余部分。这一定早上过早。 – 2012-04-19 10:26:33

+0

'const der operator *(const der&rh){...}'应该读取'der operator *(const der&rh)const {...}':您不希望结果是const,而是您的对象正在研究(*)。 – kay 2012-04-19 10:45:15

回答

-1

如下实施一个base::operator *

class base { 
protected: 
    int x; 
public: 
    base operator * (const base &rh) { 
    base b; 
    b.x = x * rh.x; 
    return b; 
    } 
}; 

,并调用它的,

der operator * (const der& rh) { 
    der d; 
    Base &b = d; // <---- assign a temporary reference of 'base' 
    b = static_cast<Base&>(*this) * rh; // <---- invoke Base::operator * 
    d.y = y * rh.y; 
    return d; 
} 
+0

@SteveJessop,我已经改变了我的帖子。实际上,由于只有一个变量'x',我试图给出另一个直接在'der'中乘以'x'的解决方案。但后来我让解决方案更通用。请检查。 – iammilind 2012-04-19 11:23:57

1
class base { 
    int x; 
public: 
    base & operator *=(const base &rh) { 
     x*=rh.x; 
     return *this; 
    } 
    base operator *(const base &rh) { 
     base b = *this; 
     b*=rh; 
     return b; 
    } 
}; 

class der : public base { 
    int y; 
public: 
    using base::operator*; 
    der & operator*= (const der& rh) { 
     base::operator*=(rh); 
     y*=rh.y; 
     return *this; 
    } 
    const der operator*(const der& rh) { 
     der d = *this; 
     d*=rh; 
     return d; 
    } 

}; 
+0

这种方法意味着'*'不可交换; 'base()* der()'类型检查,但是'der()* base()'不。此外,执行'base()* der()'可能会产生意想不到的结果(因为操作符只会将'der'对象的'base''部分 - 可能不是你想要的)。 – 2012-04-19 10:41:43

+0

@FrerichRaabe我不能遵循你的观点,用这种方法''base()* der()'和'der()* base()'无论如何都没有区别。至于对'base()* der()'有意想不到的结果,我一般同意,但这是一个普遍的问题。这是否合理取决于你的类的语义,程序员负责控制访问(通过'public'' private'等)来反映这些语义。 – enobayram 2012-04-19 11:30:06

+0

感谢您修复错别字,我没有一个方便的编译器(我现在强制使用windows)。 – enobayram 2012-04-19 11:36:14

相关问题