2012-12-16 86 views
0

我想了解繼承,我需要一些幫助建立兩個類。第一個稱爲A,第二個稱爲B. A有一個私有整數值「m_a」。它有兩個構造函數,默認的一個將m_a設置爲5.另一個將一個名爲m的整數作爲參數,並將m_a的值設置爲m。至於成員函數,它將有兩個。第一個將返回m_a。第二個將打印「你好從A!」。讓我們繼續討論B. B將有一個私有字符串m_s。一個默認的構造函數,它將m_s設置爲「asd」或除空字符串和構造函數之外的任何內容,該構造函數將一個字符串作爲參數並將m_s設置爲它的值。就功能而言,首先B將具有將返回m_s的函數。它將具有一個函數,它將與A中的打印「Hello from A」函數具有相同的名稱,它將覆蓋它並打印出「Hello from B!」相反(是多態?)。學習繼承

這些是需要的類。我有以下問題(我將發佈我在下面創建的內容) 首先,有什麼方法可以從基類獲取私有數據文件。例如,假設我想要使用m_s變量,將其添加到另一個變量並打印出它們的總和。那可能嗎 ? (以及如何)

另外,當我嘗試創建一個與默認構造函數不同的類時,我得到錯誤。我顯然做錯了什麼。問題是什麼。

我認爲這些都是我現在所有的問題,所以現在是我發佈源代碼的時候了。

#include <iostream> 
#include <string> 

using namespace std; 

class A 
{ 
private: 
    int m_a; 
public: 
    A(){m_a = 5;} 
    A(int m) 
    { 
     m_a = m; 
    } 
    void pm() 
    { 
     cout << "Hello from A!" << endl; 
    } 
    int get_a() 
    { 
     return m_a; 
    } 
}; 

class B : A 
{ 
private : 
    string m_s; 
public: 
    B(){m_s = "asd";} 
    B(string s) 
    { 
     m_s = s; 
    } 
    void pm() 
    { 
     cout << "Hello from B!" << endl; 
    } 
    string get_s() 
    { 
     return m_s; 
    } 
}; 

int main() 
{ 
    A a(10); 
    a.pm(); 
    cout << a.get_a() << endl; 
    B b("asd"); 
    b.pm(); 
    cout << b.get_s() << endl; 
     cout << b.get_a() << endl; 
    return 0; 
} 

回答

1
(is that polymorphism ?). 

不是你做的方式。如果你有一個A*類型的指針,它指向實際上是B對象的指針,並且在該指針上調用pm正確地調用了B的成員函數,這將是多態。這隻有在A中的pm函數被聲明爲虛擬,就像下面一樣。

class A 
{ 
... 
    virtual void pm(){ 
... 
}; 
... 

int main() 
{ 
    A* = new B(); 
    A->pm(); //"Hello from B!" 
} 

有什麼辦法,我可以從基類

獲取到的私人數據的Fileds不知道你的意思在這裏 - 在派生類的私人領域的例子會談。 通常,良好的類設計意味着派生類不應該需要訪問基類的(私有)字段,如果需要,您應該使該字段受到保護。

至於編譯錯誤 @ArunKumar明白了。 當你說Class B : A你從A繼承,但所有的成員都默認爲私有繼承,由於這個原因,基類的構造函數是私有的,所以你不能使用它。

然而,當你說Class B : public A它是另一端。基類的所有成員保留其無障礙環境在派生類(公共依然公共等)

+0

我明白了,我會研究一下更多。非常感謝! – Bloodcount

1

試圖改變class B : Aclass B : public A

+0

謝謝,解決了我的編譯問題:) – Bloodcount

1

的問題是,你正在使用私有繼承:

class B : A { 

默認情況下,類的繼承是私有的。在A之前添加public

class B : public A { 

至於你的其他問題......

I want to take the m_s variable, add it to another one and print out their sum.

這很容易,當談到std::string。只需創建另一個成員函數:

void addTom_s(string s) { m_s += s; }