【问题标题】:Hiding copy constructors for abstract base class隐藏抽象基类的复制构造函数
【发布时间】:2014-07-16 15:10:37
【问题描述】:

我有一个抽象基类,它有一些虚拟方法和一个虚拟析构函数。我想将基类(和派生类)的复制构造函数和赋值运算符设为私有,这样我就可以隐藏它们并且静态分析工具(klockwork)无法标记它。这是我的代码 sn-p:

class Parent: public mainParentClassIDontCareAbout
{
 public:
         Parent (int a);
         virtual ~Parent ();
 protected:
         void doSomething(); 
      .
      .
 private:
          // Hide assignment operator and copy constructor
         Parent (const Parent&) {};
         Parent operator= (const Parent&) {return *this;};

 } // end of parent class definition

class Child : public Parent
{
 public:
         Child (void *x, int y, bool z);
         ~Child ();
 protected:
           .
           .
           .
 private:
          // Hide assignment operator and copy constructor
         Child (const Child&) {};
         Child operator= (const Child&) {return *this;};

 } // end of parent class definition

但是,我得到一个编译时错误:

invalid abstract return type for member function ‘Lib::Parent Lib::Parent::operator=(const Lib::Parent&)’

我想隐藏赋值运算符和复制构造函数。当我们有一个虚拟析构函数时,这不是一个有效的行为吗?或者如果我想有相同的场景,有什么解决方案吗?

【问题讨论】:

    标签: c++ inheritance polymorphism copy-constructor static-analysis


    【解决方案1】:

    赋值运算符应该返回一个引用:

    Parent & operator= (const Parent&) {return *this;}
           ^
    

    同样适用于Child。或者,如果您不关心链接分配,它们可能不会返回任何内容。

    您的尝试返回对象的副本,在 Parent 的情况下这是不可能的,因为 Parent 是抽象的,无法实例化。

    【讨论】:

    • 复制构造函数也应该这样吗? Parent & (cosnt Parent&) {}; ?
    • @noobcoder:不,构造函数不返回任何内容。它们被声明为与它们构造的类同名。
    • +1 但是有一个问题,代码不会按原样编译(在添加对 operator= 的返回类型的引用之后),因为 @987654326 没有默认 ctor @,并且Child 的复制ctor 将失败(它不知道如何实例化对象的Parent 部分)。因此,请执行 Parent (int a=0){...}; 之类的操作或将 Child 中的基本 ctor 称为 Child (const Child&): Parent(value){...}
    • @Mike:非常适合赋值运算符。但我确实在复制构造函数的 Child 类中得到错误:错误:没有匹配函数调用'Lib::Parent::Parent()'
    • @Mike。那是正确的。我将 Parent 类 ctor 更改为 Parent (int a = 0) 并且效果很好。将其标记为完成。
    猜你喜欢
    • 2015-06-03
    • 2011-07-21
    • 2010-12-02
    • 1970-01-01
    • 2011-03-16
    • 2010-11-26
    • 1970-01-01
    相关资源
    最近更新 更多