请教一个多态的问题
代码如下:
template<class T> class Array1d
{
...
public:
virtual Array1d<T>& operator=(const Array1d<T>& rhs) {...}
}
template<class ConcreteArray1d> class InterfacedArray1d : public virtual Array1d<typename ConcreteArray1d::EltT>
{
...
public:
virtual Array1d<EltT>& operator=(const Array1d<EltT>& rhs) {
return Array1d<ConcreteArray1d::EltT>::operator=(rhs);
}
}
template<class T, Subscript n0> class ConcreteRigidArray1d
{
...
}
template<class T, Subscript n0> class RigidArray1d : public InterfacedArray1d< ConcreteRigidArray1d<T, n0> >
{
...
public:
virtual Array1d<T>& operator=(const Array1d<T>& rhs) {
return InterfacedArray1d< ConcreteRigidArray1d<T, n0> >::operator=(rhs);
}
}
template<class T> class DualGaussianModel
{
...
public:
virtual Array1d<T>& parameters()
{
return a_values;
}
private:
RigidArray1d<T, 6> a_values;
};
main()
{
...
FormedArray1d<double> parms; //另外一个从Array1d共有派生的类
...
DualGaussianModel<double> model;
model.parameters()=parms;
//这一行不会调用自定义的Array1d<T>& Array1d<T>::operator=(const Array1d<T>& rhs),
//而是调用编译器自己合成的一个拷贝赋值函数,为什么呢?
...
}
谢谢大家了!
[解决办法]
[解决办法]
将赋值操作符重载定义为虚函数是一种不被推荐的做法。
子类如果自定义赋值操作符,那么应该在自定义赋值操作符中主动调用父类的赋值操作符。
看下面的代码,何处自定义了Array1d<T>& Array1d<T>::operator=(const Array1d<T>& rhs)?
而你定义的是virtual Array1d<T>& operator=(const ConstArray1d<T>& rhs),这种做法也是不推荐使用的,既然自定义赋值操作符,形参为什么非要搞成父类引用类型?在一个类中,如果自定义赋值操作符,一般的做法:左右操作数的类型相同。否则比较混乱,即使自定义了赋值操作符,也不见得调用operator=时调用自定义的operaotr=。改成下面这样试试:
- C/C++ code
template<typename T>class Array1d: public ConstArray1d<T>{ //...public: virtual Array1d<T>& operator=(const Array1d<T>& rhs) // 修改原先的形参类型 { ConstArray1d<T>::operator=(rhs); // 调用父类的operator= std::cout << "right here" << std::endl; return *this; }};
[解决办法]