我可以使用指针而不是引用(&)为Abstract基类编写复制构造函数吗?

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)

Naw*_*waz 5

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继承以了解它们之间的区别.您将在本网站上找到许多主题.:-)