C++ 抽象类和继承的问题

C++ 抽象类和继承的问题,c++,inheritance,abstract-class,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

假设我有这两个类:

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
继承的类型的引用) 我想做的是创建另一个
num*y
,它将指向
*x
副本,这样如果我更改
*y
,我就不会更改
*x
。我不知道怎么做,因为
num
是抽象的,所以我不能创建这种类型的对象来制作副本

好的,还有一个问题。 如果我重载了
您正在寻找的,通常也称为克隆模式

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

virtual std::unique_ptr<num> clone() const = 0;
virtualstd::unique_ptr 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();
}
class-num{
公众:
虚拟std::unique_ptr clone()const=0;
//其他成员。。。
};
类my_num:public num{
公众:
虚拟std::unique_ptr clone()常量{
return std::make_unique(*this);
}
//其他成员。。。
};
int main(){
num*x=&get(…);
自动y=x->clone();
}

只需使用
tmp
的复制构造函数?我使用
num*
是因为我不知道
get
返回什么。它可以是
tmp
或从
num
继承的其他类型。所以我不能使用课程的特定副本构造函数。大脑打嗝。
virtual std::unique_ptr<num> clone() const = 0;
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();
}