在具有纯虚方法的类中或仅在派生类中定义复制构造函数/ operator =是否有意义?抽象类,复制构造函数
4
A
回答
5
像正常的类:是的,如果你有一个具体的实施需求。
2
如果它是您计划复制的对象,那么这是个好主意。如果不是,请参阅下面的评论。
如果您的虚拟基类依赖于需要显式分配和复制的资源(缓冲区,操作系统对象等),那么定义复制构造函数可以避免在每个派生类中分别执行此操作的麻烦(并且,另外,如果这些基础资源是私有的,则使用公有继承)。
例如为:
class Base {
public:
Base(const Base &);
virtual ~Base();
virtual void Method() = 0;
// etc...
private:
int *memberIntArray;
int length;
// etc...
};
class DerivedOne : public Base{
public:
DerivedOne(const DerivedOne &);
virtual ~DerivedOne();
virtual void Method();
// etc...
protected:
// data, etc...
};
class DerivedTwo : public Base{
public:
DerivedTwo(const DerivedTwo &);
virtual ~DerivedTwo();
virtual void Method();
// etc...
protected:
// data, etc...
};
///////////////////
Base::Base(const Base & other) {
this->length = other.length;
this->memberIntArray = new int[length];
memcpy(this->memberIntArray,other.memberIntArray,length);
}
//etc...
DerivedOne::DerivedOne(const DerivedOne & other)
: Base(other)
{
//etc...
}
DerivedTwo::DerivedTwo(const DerivedTwo & other)
: Base(other)
{
//etc...
}
0
是的,你应该。
即使是抽象类也适用于您为自己的复制构造函数,复制赋值运算符和析构函数实现的规则。
另外,看看Rule of Three
0
这取决于你的使用情况,如果你没有做任何事情需要复制处理,例如,复制句柄。如果需要,你最好在派生类中定义一个拷贝构造函数。
4
如果它只有纯粹的虚拟方法(并且没有数据成员),那么,不,合成的很好(并且不会做任何事情)。
如果它确实有数据成员,那么你应该定义自己的拷贝构造函数,如果/当它有意义的时候,就像其他任何类一样。派生类与它没有多大关系。
相关问题
- 1. 复制构造函数复制指针到抽象类
- 2. 使用“抽象”超类的复制构造函数
- 3. 拷贝构造函数:深复制一个抽象类
- 4. 复制构造函数类
- 5. 通用抽象类构造函数
- 6. 抽象类和构造函数
- 7. 抽象类中的构造函数
- 8. 抽象类和构造函数
- 9. 抽象类,构造函数和接口
- 10. 的Java抽象类的构造函数
- 11. 抽象类中的构造函数?
- 12. Java:抽象类构造函数和this()
- 13. 抽象类的构造函数
- 14. 抽象类中的构造函数?
- 15. 抽象构造函数java
- 16. 抽象类构造函数和普通类构造函数的区别?
- 17. C#:使用抽象类强制构造函数签名?
- 18. 字符串类的构造函数和复制构造函数
- 19. 抽象参数构造函数
- 20. 复制构造函数的const对象
- 21. 构造函数具有抽象类的对象作为参数
- 22. 在“异构对象”类中复制构造函数
- 23. C#抽象类构造器
- 24. 模板类的复制构造函数
- 25. 通用集类 - 复制构造函数
- 26. C++类复制构造函数
- 27. 扩展一个抽象构造函数?
- 28. Java抽象构造函数问题
- 29. 抽象构造函数在C#
- 30. 使用抽象与构造函数
我只是补充说应该使用一个拷贝构造函数来重载=操作符。它提高了可读性,并且不易出错。 – janhink 2011-04-08 09:41:58
我真的很喜欢将私有空副本构造函数和赋值运算符声明为一切。这样,如果我试图不恰当地复制某些内容,编译器会抱怨。只有当我确实需要*可复制的对象时,我才会公开这些内容。你可能会开怀大笑,但是当我开始练习时,你会惊讶地发现有多少问题得到解决。 ;) – Nate 2011-04-08 09:55:28