2017-09-22 91 views
0

我想要設計類似於以下的類結構。主要想法是必須在需要時更新基類指針。同樣,我們可以在子類上進行一些不相關的操作。如何讓子類包含指向基類的指針

我想知道如何重新設計這個具有多態性和封裝。這可能是一個很noob問題,但任何幫助表示讚賞。

我不關心被剪切的內存泄漏,因爲在實際代碼中使用了這些代碼,因此正在使用刪除來避免任何問題。

我想問的是,有沒有類似於下面的類結構更好的方法,而不是Child1調用getBase來獲取基類指針,它可以擴展基類,其中基類可能已經已經實例化,child1只是封裝並提供一些功能。

class Base { 
private: 
    int a; 
    char b; 
public: 
    Base(int argA, char argB): a(argA), b(argB) { 
    } 


    char getChar() { 
     return b; 
    } 

    int getInt() { 
     return a; 
    } 

    void setChar(char foo) { 
     b = foo; 
    } 

    void setInt(int foo) { 
     a = foo; 
    } 
}; 

class Child1 { 
private: 

    Base *base; 
public: 
    Child1(PhysicalBlock *argBase) : base(argBase) { 

    } 

    Base *getBase() { 
     return base; 
    } 

    uint64_t getSum() { 
     int a = base->getInt(); 
     char b = base->getChar(); 
     return a + (int)b; 
    } 
}; 

class Child2 { 
private: 
    Base * base; 
    double c; 
public: 
    Child2(Base * argBase) : base(argBase), c(0.0) { 

    } 

    Base *getBase() { 
     return base; 
    } 

    double getDivision() { 
     int a = base->getInt(); 
     char b = base->getChar(); 

     return (double) ((double)a + (double)b)/c; 
    } 
}; 

int bla(Child1 * c1) 
{ 
    Base * b1 = c1->getBase(); 
    b1->setInt(55); 
    b1->setChar('z'); 
    return c1->getSum(); 
} 

int main() 
{ 
    Base * b1 = new Base(1, 'a'); 
    Base * b2 = new Base(2, 'b'); 

    Child1 * child1 = new Child1(b1); 
    Child2 * child2 = new Child2(b2); 

    bla(child1); 

    return 0; 
} 
+2

你爲什麼給我們展示'bla()'?哦,也許是這個'foo(child1);' - >'bla(child1);'?我也不明白你的問題。我的意思是我不認爲你在問你的程序的內存泄漏... – gsamaras

+0

你真的*試圖實現什麼?這聽起來有點像[XY問題](http://xyproblem.info)。 –

+0

@gsamaras已添加編輯。是的,這是一個錯字。我指的是bla(child1) –

回答

0

我覺得你Child的意思是從base classderived class

class Base{ 
    // some stuff here 
}; 

class Child : public Base{ 
    // some code here 
}; 

現在孩子真Base類的孩子。小孩可以繼承publicprivateprotected每一個都有其用處,所以在OOP章節繼承中讀一本有用的書。

  • 在我上面顯示的示例中,您實現了Is-a relationship。所以你可以說: a man is a human, a dog is an animal...

  • 在你的例子中,你正在實現has-a relationship:所以在你的例子類Child has一個類的基類對象。你可以說'遏制。

  • 我不認爲你需要在派生類中包含基類的對象。例如:

    class Base{}; 
    class Derived : protected Base{ 
        Base* pBase; // I don't think you need this. 
    }; 
    
  • 您可以訪問基座部件(公共,保護)的形式導出,所以沒有必要包含一個。

相關問題