在IBM ISL采访中被问到这个问题。 我可以使用指针而不是引用(&)来编写Abstract基类的复制构造函数吗?
我认为可以使用它。有什么意见/建议吗?
#include <string>
//abstract base class
class ABC{
int a;
int b;
char *p;
public:
virtual void f() = 0;
ABC(){};
ABC(ABC* abc){
a = abc->a;
b = abc->b;
p = new char[strlen(abc->p)+1];
p = strcpy(p, abc->p);
}
};
//derived class
class ConcreteDerivedClass: private ABC
{
public:
ConcreteDerivedClass(){}
void f(){}
ConcreteDerivedClass(ConcreteDerivedClass& obj):ABC(&obj){}
};
答案 0 :(得分:5)
ABC(ABC* abc)
这不是复制构造函数。
复制构造函数必须是以下形式之一:
ABC(ABC & abc);
ABC(ABC const & abc); //most common form
ABC(ABC volatile & abc);
ABC(ABC const volatile & abc);
第二个是最常见的。因此,请定义此表单的复制构造函数:
ABC(ABC const & abc);
然后从派生的copy-constructor中调用它:
ConcreteDerivedClass(ConcreteDerivedClass const & obj): ABC( obj)
//^^^^^ make it const
此处,ABC(obj)
调用基类copy-constructor,并将obj
作为参考传递。
请注意,您{em>私有来自ABC
。
class ConcreteDerivedClass: private ABC
我认为你需要的是public
继承:
class ConcreteDerivedClass: public ABC
搜索private
继承和public
继承以了解它们之间的区别。您将在本网站上找到许多主题。 : - )
答案 1 :(得分:2)
你不能,因为编译器会为你生成一个默认的拷贝构造函数。然而,你的例子并没有错。你从派生类中调用的不是复制构造函数。
答案 2 :(得分:1)
根据this,它必须是参考。