所以我有一个基类,它有一个私有成员和一个也有一些成员的派生类,基类定义了一个operator =,这是我的问题:
这是正确的方法吗?还是有更好的方法? 我是否会沿途进行任何切片?
class A
{
private:
int* Arr;
public:
A(){
Arr=new int[10];
for(int i=0;i<10;i++){
Arr[i]=2*i;
}
}
const A& operator=(const A& a){
delete []Arr;
Arr=new int[10];
for(int i=0;i<10;i++){
Arr[i]=a.Arr[i];
}
return *this;
}
};
class B: public A
{
private:
int * Arr2;
public:
B(){
Arr2=new int[10];
for(int i=0;i<10;i++){
Arr2[i]=3*i;
}
}
const B& operator=(const B& b){
A::operator=(b);
delete []Arr2;
Arr2=new int[10];
for(int i=0;i<10;i++){
Arr2[i]=b.Arr2[i];
}
return *this;
}
};
我知道这不是一个完美的代码,但我只是写了一个简单的问题。
答案 0 :(得分:1)
经过大量研究后,我得出了这样的结论:
虽然这种基类赋值运算符的使用可以正常工作
A::operator=(b)
代码仍然需要提供适当的异常安全,自我分配安全 正如评论中提到的那样保证。
此外,由于我们需要实现一个赋值运算符,这也意味着rule of three我们需要实现一个拷贝构造函数,如前面提到的那样here会导致不必要的代码重复。
那么我们如何解决所有这些问题(可能还有一些......)? 我发现的最佳原因是使用Copy-and-Swap-Idiom。我认为除了该职位提供的内容之外,不需要进一步解释。
答案 1 :(得分:0)
你想要什么不是类的层次结构。无法分配给基础对象以获取派生对象的属性。基础对象始终是基础对象。如果您希望具有多态行为但保持合理的值语义,请将多态性封装在非多态类中:
class A_impl;
class A {
public:
//Public interface:
//...
private:
//Assuming `value_ptr` similar to
//https://bitbucket.org/martinhofernandes/wheels/src/17aee21522ce8d07c7a74b138e528fadf04d62ed/include/wheels/smart_ptr/value_ptr.h%2B%2B?at=default
value_ptr<A_impl> impl;
};
class A_impl {
public:
//Implementation interface:
//virtual ...
//virtual ~A_impl() {}
};
class B : public A_impl {
public:
//Implementation:
//...
};
答案 2 :(得分:-1)
你应该写复制构造函数。