这是我的问题的代码:


class ICommon
{
public:
 virtual ICommon& operator=(const ICommon & p)const=0;
};

class CSpecial : public ICommon
{
public:
 CSpecial& operator=(const CSpecial & cs)const
 {
  //custom operations
  return *this;
 }
};
CSpecial obj;

基本上:我希望接口(interface)ICommon强制其后代实现=运算符,但不希望实现中具有任何类型转换。编译器说“无法实例化抽象类。
任何帮助/建议将不胜感激。

最佳答案

为了回应Naveen所说的,CSpecial中定义的operator=()与ICommon中定义的不兼容,并导致重载而不是覆盖。尽管您可以具有协变返回类型(如上所示),但参数本身不能是协变的。

此外,您已将ICommon::operator=()定义为const,这似乎违反直觉。在派生类中,已将其设为非常量(如预期的那样),但这又使函数签名进一步不兼容。

Naveen的clone()想法可能是您最好的选择。否则,您可以将ICommon const引用传递给CSpecial operator=(),并在内部尝试一些dynamic_cast<>()魔术,但这听起来很可笑。

祝好运!

07-24 09:51