簡體   English   中英

學習繼承

[英]Learning inheritance

我正在嘗試了解繼承,並且需要一些幫助來建立兩個類。 第一個稱為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中的打印“來自A的Hello”功能同名的功能,它將覆蓋該功能,並打印出“來自B的Hello!”。 相反(是多態性嗎?)。

這些是所需的類。 我有以下問題(我將在下面發布我創建的內容)首先,有什么方法可以從基類訪問私有數據文件。 例如,假設我要使用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;
}
(is that polymorphism ?).

不是您完成的方式。 如果您有一個類型為A*的指針,它實際上指向了一個B對象,並且對該指針調用pm正確地調用了B的成員函數,那將是多態性。只有在聲明了A中的pm函數的情況下,這才有可能如下面所示。

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

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

有什么辦法可以從基類獲取私有數據文件嗎?

不確定您的意思-您的示例談到了派生類的私有字段。 通常,良好的類設計意味着派生類不需要訪問基類的(私有)字段,如果需要,則應使該字段受保護。

至於編譯錯誤, @ ArunKumar准確地得到了它。 當您說Class B : A您繼承自A,但是默認情況下所有成員都被繼承為私有,因此,基類構造函數是私有的,因此您不能使用它。

但是,當您說Class B : public A它是頻譜的另一端。 基類的所有成員都保留其在派生類中的可訪問性(公眾保持公開狀態,等等)

嘗試將class B : A更改為class B : A class B : public A

問題是您正在使用私有繼承:

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; }

暫無
暫無

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

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