0

私は継承を理解しようとしていますが、2つのクラスを構築するのに助けが必要です。最初のものはAと呼ばれ、2番目のものはBと呼ばれます。Aには1つのプライベート整数値「m_a」があります。2つのコンストラクターがあります。デフォルトのコンストラクターはm_aを5に設定し、もう1つは引数としてmと呼ばれる整数を取り、m_aの値をmに設定します。メンバー関数に関しては、2つあります。最初のものはm_aを返します。2つ目は「HellofromA!」と印刷されます。Bに移りましょう。Bにはプライベート文字列m_sがあります。m_sを「asd」または空の文字列以外に設定するデフォルトのコンストラクターと、引数として文字列を取り、m_sをその値に設定するコンストラクター。関数に関する限り、最初にBにはm_sを返す関数があります。プリントと同じ名前の機能があります」

それらは必要なクラスです。次の質問があります(以下に作成したものを投稿します)。最初に、基本クラスからプライベートデータファイルにアクセスする方法はありますか。たとえば、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;
}
4

3 に答える 3

1
(is that polymorphism ?).

あなたがそれをした方法ではありません。A*実際のBオブジェクトを指す型のポインターがあり、そのポインターを呼び出すとBのメンバー関数が正しく呼び出された場合、ポリモーフィズムになります。これは、以下のように、Aの関数が仮想として宣言されているpm場合にのみ可能です。pm

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

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

基本クラスからプライベートデータファイルにアクセスする方法はありますか

ここで何を意味するのかわからない-あなたの例は派生クラスのプライベートフィールドについて話している。通常、優れたクラス設計とは、派生クラスが基本クラスの(プライベート)フィールドにアクセスする必要がないことを意味します。これが必要な場合は、そのフィールドを保護する必要があります。

コンパイルエラーに関しては、@ArunKumarが正確に取得しました。Aから継承すると言うとClass B : A、デフォルトではすべてのメンバーがプライベートとして継承されます。このため、基本クラスのコンストラクターはプライベートであるため、使用できません。

しかし、あなたが言うときClass B : public A、それはスペクトルのもう一方の端です。基本クラスのすべてのメンバーは、派生クラスでのアクセス可能性を保持します(パブリックはパブリックのままですなど)

于 2012-12-16T13:25:19.007 に答える
1

に変更class B : Aしてみますclass B : public A

于 2012-12-16T13:26:36.367 に答える
1

問題は、プライベート継承を使用していることです。

class B : A {

クラスを介した継承は、デフォルトではプライベートです。public前に追加しAます。

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; }
于 2012-12-16T13:28:22.850 に答える