2

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){}
};
4

3 に答える 3

5
ABC(ABC* abc)

これはコピーコンストラクターではありません。

コピー コンストラクターは、次のいずれかの形式である必要があります。

ABC(ABC & abc);
ABC(ABC const & abc);  //most common form
ABC(ABC volatile & abc);
ABC(ABC const volatile & abc);

2番目のものは最も一般的です。したがって、次の形式のコピー コンストラクターを定義します。

ABC(ABC const & abc);

次に、派生したコピー コンストラクターから次のように呼び出します。

ConcreteDerivedClass(ConcreteDerivedClass const & obj): ABC( obj)
                                        //^^^^^ make it const

ここでABC(obj)は、基本クラスのコピー コンストラクターを呼び出し、obj参照として渡します。

から個人的に継承していることに注意してくださいABC

class ConcreteDerivedClass: private ABC

必要なのはpublic継承と呼ばれるものだと思います:

class ConcreteDerivedClass: public ABC

private継承と継承を検索しpublicて、それらの違いを確認してください。このサイトには数多くのトピックがあります。:-)

于 2012-08-26T14:25:36.533 に答える
2

コンパイラーがデフォルトのコピーコンストラクターを生成するため、できません。ただし、あなたの例は間違っていません。派生クラスから呼び出すものは、コピー コンストラクターではありません。

于 2012-08-26T14:33:35.937 に答える
1

これによると、それは参照でなければなりません。

于 2012-08-26T14:26:52.410 に答える