抽象类和继承问题

时间:2014-09-12 13:25:29

标签: c++ inheritance abstract-class

假设我有这两个类:

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,我就不会更改{{1} }}。我无法弄清楚如何做到这一点,因为*x是抽象的,所以我无法创建这种类型的对象来制作副本。

好的,另一个问题。 如果我重载num运算符:

<<

然后尝试这样做:

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

我收到错误cout<<*x<<endl; 这是为什么?

2 个答案:

答案 0 :(得分:1)

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

它基本上是一个纯虚方法

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

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

答案 1 :(得分:1)

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

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();
}