在C++中使用接口時;你有你的抽象(父母)課程。然後你有從父類繼承並實現純虛函數的子類。在C++接口中返回父類型
當另一個類使用(子)接口時,此時抽象類中的要點是什麼?如果嘗試在函數中使用父類型,即返回Parent類型,則會出現編譯器錯誤(可能是因爲編譯器不知道要分配多少內存)。
誰能告訴我如何做到上述?
例如
父=形狀。 Child =矩形。其中包含返回類型Shape的方法的Thrid類?
在此先感謝您的任何幫助/信息。
在C++中使用接口時;你有你的抽象(父母)課程。然後你有從父類繼承並實現純虛函數的子類。在C++接口中返回父類型
當另一個類使用(子)接口時,此時抽象類中的要點是什麼?如果嘗試在函數中使用父類型,即返回Parent類型,則會出現編譯器錯誤(可能是因爲編譯器不知道要分配多少內存)。
誰能告訴我如何做到上述?
例如
父=形狀。 Child =矩形。其中包含返回類型Shape的方法的Thrid類?
在此先感謝您的任何幫助/信息。
一個很大的優點是所有的孩子都共享相同的界面。如果您有第二個孩子繼承父級(Child = Circle),則無論具體的子類如何,它們都可以使用相同的函數。假設你有一個向量指向形狀(向量爲< Shape *>),那麼無論你在向量中擁有哪些形狀,如果你的基類Shape有一個虛擬方法Draw(),您可以從矢量的每個元素中使用該方法,而不必知道該Draw方法是如何實現的。
這回答了我的問題,並且還告訴我使用Shape *而不是Shape。謝謝! – seanAshmore 2012-07-06 12:16:46
我想你的堆棧,因爲你根本無法實例化抽象類型不工作在返回的對象:
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();
。
你不能實例化一個抽象類。期。如果您想要通過基類接口訪問孩子,則必須通過指針或對基類的引用來訪問孩子。
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.
如果你不知道爲什麼這很方便,你應該研究術語「多態性」。
你是什麼意思的「返回類型形狀」。你的意思是返回一個「形狀」?一個'形狀*'? – BoBTFish 2012-07-06 10:57:05
刪除舊信息 – seanAshmore 2012-07-06 11:00:54
優化你的Q,舉例(接近downvote)。 – 2012-07-06 11:01:01