【发布时间】: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<<'
这是为什么?
【问题讨论】:
-
只使用
tmp的复制构造函数? -
我正在使用
num*,因为我不知道get会返回什么。它可以是tmp或继承自num的其他类型。所以我不能使用特定的复制构造函数 -
当然。大脑打嗝。
标签: c++ inheritance abstract-class