簡體   English   中英

繼承類的組成

[英]composition of Inherited classes

可能已經有一個問題了,但我找不到。

我敢肯定有一個簡單的解決方案,但我看不到。

假設您具有以下條件:

class FooBase
{
protected:
    BarBase myInstance;
}

class FooChild : public FooBase
{
protected:
    BarChild myInstance;
}

class BarChild : public BarBase
{
}

因此,基本上,您想在FooChild類中使用BarBase的派生版本。

我認為在上面的代碼中,將有2個不同的myInstance實例(一個BarBase和一個BarChild)。

我只想擁有一個實例,這樣我就可以在FooBase中使用BarBase,而在FooChild中使用BarChild。

有一個優雅的解決方案嗎?

您是否可以嘗試這樣的操作,以便僅創建一個實例。

#include <iostream>

class BarBase
{
}
;
class BarChild : public BarBase
{
}
;

class FooBase
{
public:
  FooBase(BarBase* baseBar);
protected:
  BarBase* myInstance;
}
;


class FooChild : public FooBase
{
public:
  FooChild(BarBase* base)
;
}
;


FooBase::FooBase(BarBase* baseBar)
{
  myInstance = baseBar;
}

FooChild::FooChild(BarBase* childBar) : FooBase(childBar)
{

}

int main()
{
  BarChild *bc = new BarChild();
  FooChild fc(bc);
}

我不知道這是正確的解決方案還是優雅的解決方案;)

可以選擇模板嗎?

tempalate <typename T = BarBase>
class FooBase{
protected:
    T myInstance;
};

class FooChild : public FooBase<BarChild> {};

如果我使用intdouble進行測試,則僅使用一個成員變量即可按需工作http : //ideone.com/nOfR5x

但是,它確實需要在FooBase聲明后FooBase尖括號。

我相信,虛擬化是您正在尋找的東西。 看看吧。 您可以簡單地使用構造器方法來創建這些變量。 如果創建派生類,則它將調用該類的構造函數,該構造函數將創建該變量。

暫無
暫無

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

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