2012-07-06 143 views
0

在C++中使用接口時;你有你的抽象(父母)課程。然後你有從父類繼承並實現純虛函數的子類。在C++接口中返回父類型

當另一個類使用(子)接口時,此時抽象類中的要點是什麼?如果嘗試在函數中使用父類型,即返回Parent類型,則會出現編譯器錯誤(可能是因爲編譯器不知道要分配多少內存)。

誰能告訴我如何做到上述?

例如

父=形狀。 Child =矩形。其中包含返回類型Shape的方法的Thrid類?

在此先感謝您的任何幫助/信息。

+1

你是什麼意思的「返回類型形狀」。你的意思是返回一個「形狀」?一個'形狀*'? – BoBTFish 2012-07-06 10:57:05

+0

刪除舊信息 – seanAshmore 2012-07-06 11:00:54

+1

優化你的Q,舉例(接近downvote)。 – 2012-07-06 11:01:01

回答

2

一個很大的優點是所有的孩子都共享相同的界面。如果您有第二個孩子繼承父級(Child = Circle),則無論具體的子類如何,它們都可以使用相同的函數。假設你有一個向量指向形狀(向量爲< Shape *>),那麼無論你在向量中擁有哪些形狀,如果你的基類Shape有一個虛擬方法Draw(),您可以從矢量的每個元素中使用該方法,而不必知道該Draw方法是如何實現的。

+0

這回答了我的問題,並且還告訴我使用Shape *而不是Shape。謝謝! – seanAshmore 2012-07-06 12:16:46

0

我想你的堆棧,因爲你根本無法實例化抽象類型不工作在返回的對象:

Parent Child::foo() { 
    return Child(12); 
} 

這意味着,編譯器儲備(或者說,將保留)的空間爲Parent。當致電foo時,也嘗試複製構造Parent

可能的意思是什麼這樣的:

Parent* Child::foo() { 
    return new Child(12); // actually you should really be using a shared pointer here, but that's a different story 
} 

這工作,因爲指針Parent和指針Child有大小和對齊。

由於存在協方差,您甚至可以直接返回Child。如果Child繼承自Parent,則C++允許您執行Parent* Parent::foo();作爲Child* Child::foo();

1

你不能實例化一個抽象類。期。如果您想要通過基類接口訪問孩子,則必須通過指針或對基類的引用來訪問孩子。

class A 
{ 
public: 
    virtual void doit() = 0; 
} 

class B : public A 
{ 
public: 
    virtual void doit() 
    {std::cout << "Hi.";} 
} 

...later, in main 

A *a = new B; 
a->doit(); //this calls B's implementation. 

如果你不知道爲什麼這很方便,你應該研究術語「多態性」。