use*_*036 2 c++ oop constructor copy-constructor
在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){}
};
Run Code Online (Sandbox Code Playgroud)
ABC(ABC* abc)
Run Code Online (Sandbox Code Playgroud)
这不是复制构造函数.
复制构造函数必须是以下形式之一:
ABC(ABC & abc);
ABC(ABC const & abc); //most common form
ABC(ABC volatile & abc);
ABC(ABC const volatile & abc);
Run Code Online (Sandbox Code Playgroud)
第二个是最常见的.因此,定义此表单的副本构造函数:
ABC(ABC const & abc);
Run Code Online (Sandbox Code Playgroud)
然后从派生的copy-constructor中调用它:
ConcreteDerivedClass(ConcreteDerivedClass const & obj): ABC( obj)
//^^^^^ make it const
Run Code Online (Sandbox Code Playgroud)
在这里,ABC(obj)调用基类copy-constructor,obj作为引用传递.
请注意,你是私下内在的ABC.
class ConcreteDerivedClass: private ABC
Run Code Online (Sandbox Code Playgroud)
我认为你需要的是public继承:
class ConcreteDerivedClass: public ABC
Run Code Online (Sandbox Code Playgroud)
搜索private继承和public继承以了解它们之间的区别.您将在本网站上找到许多主题.:-)