【问题标题】:issue with abstract classes and inheritence抽象类和继承的问题
【发布时间】:2014-09-12 13:25:29
【问题描述】:

假设我有这两个类:

class num{
public:
    int a;
    num(){};
    num(int x):a(x){};
    num(const num& n):a(n.a){}
    virtual bool operator==(const num& n)const = 0;
    virtual ~num(){};
};

class tmp: public num{
public:
    tmp(){};
    tmp(int x):num(x){};
    tmp(const num& n): num(n){}
    tmp(const tmp& t): num(t.a){}
    virtual bool operator==(const num& n)const{
        return tmp(n).a == a;
    }
    virtual ~tmp(){};
};

在 main 中是这样的:

int main() {
    num* x = &get(...);

    return 0;
}

get 返回tmp 类型的引用(在这种情况下。通常它返回对继承自num 的类型的引用) 我想做的是创建另一个num* y,它将指向*x副本,这样如果我更改*y,我就不会更改*x。而且我不知道该怎么做,因为num 是抽象的,所以我不能创建这种类型的对象来制作副本。

好的,还有一个问题。 如果我重载<< 运算符:

    std::ostream& operator<<(std::ostream& os, const tmp& t){
        return os<<t.a<<endl;
    }

然后尝试这样做:

cout<<*x<<endl;

我收到一个错误no match for 'operator&lt;&lt;' 这是为什么?

【问题讨论】:

  • 只使用tmp的复制构造函数?
  • 我正在使用num*,因为我不知道get 会返回什么。它可以是tmp 或继承自num 的其他类型。所以我不能使用特定的复制构造函数
  • 当然。大脑打嗝。

标签: c++ inheritance abstract-class


【解决方案1】:

您正在寻找prototype pattern,通常也称为克隆模式

基本上是纯虚方法

virtual std::unique_ptr<num> clone() const = 0;

...您在num 中声明的,将被每个派生类覆盖。然后,您只需调用 x-&gt;clone(); 即可获取正确类型的全新对象。

【讨论】:

    【解决方案2】:

    您需要一个虚函数来根据对象的动态类型克隆对象。它必须返回一个(最好是智能的)指针,指向新分配的正确类型的对象。例如:

    class num {
    public:
        virtual std::unique_ptr<num> clone() const = 0;
        // other members...
    };
    
    class my_num : public num {
    public:
        virtual std::unique_ptr<num> clone() const {
            return std::make_unique<my_num>(*this);
        }
        // other members...
    };
    
    int main() {
        num* x = &get(...);
        auto y = x->clone();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-15
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多