读书人

请问一个多态的有关问题

发布时间: 2012-09-28 00:03:35 作者: rapoo

请教一个多态的问题
代码如下:
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),
//而是调用编译器自己合成的一个拷贝赋值函数,为什么呢?
...
}

谢谢大家了!

[解决办法]

探讨

pengzhixi: 问一下,定义的错误在哪里,请指出。
ri_aje:在visual studio 2010下调试,RigidArray1d::=; InterfacedArray1d::=; Array1d::=都没有被调用,直接调用的是编译器自己合成的赋值函数

[解决办法]
将赋值操作符重载定义为虚函数是一种不被推荐的做法。

子类如果自定义赋值操作符,那么应该在自定义赋值操作符中主动调用父类的赋值操作符。
看下面的代码,何处自定义了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;    }};
[解决办法]
探讨

引用:

引用:

xingfeng2510, ri_aje,感谢二位的指正,但还有一个问题,将Array1d的赋值操作符形参表修改后,将与其基类ConstArray1d 的赋值操作符形参表不一样,按照《C++ primer》的说法,这样就无法override基类的对应的实例了啊?

是的,还用其他改法可以解决这个问题。不过绕来绕去终归是一个问……

读书人网 >C++

热点推荐