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

时间:2012-08-26 14:23:05

标签: 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){}
};

3 个答案:

答案 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,它必须是参考。