簡體   English   中英

我可以使用指針而不是引用(&)為Abstract基類編寫復制構造函數嗎?

[英]Can I write a copy constructor for an Abstract base class using pointer instead of reference (&)?

在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){}
};
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作為引用。

請注意,你是私下固執的ABC

class ConcreteDerivedClass: private ABC

我認為你需要的是public繼承:

class ConcreteDerivedClass: public ABC

搜索private繼承和public繼承以了解它們之間的區別。 您將在本網站上找到許多主題。 :-)

你不能,因為編譯器會為你生成一個默認的復制構造函數。 然而,你的例子並沒有錯。 你從派生類調用的不是復制構造函數。

根據這一點,它必須是一個參考。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM