抽象类和继承性的问题

issue with abstract classes and inheritence

本文关键字:问题 继承性 抽象类      更新时间:2023-10-16

假设我有这两个类:

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

主要是这样的:

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

get返回类型为tmp的引用(在这种情况下。通常,它返回对继承自num的类型的引用)我想做的是创建另一个指向*x副本num* y,这样,如果我更改*y,我就不会更改*x。我不太清楚如何做到这一点,因为num是抽象的,所以我不能创建这种类型的对象来进行复制。

好的,还有一个问题。如果我过载<<操作员:

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

然后尝试这样做:

cout<<*x<<endl;

我得到一个错误no match for 'operator<<'为什么?

您正在寻找原型模式,也称为克隆模式

这基本上是一种纯粹的虚拟方法

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

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

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

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