C++でクラスの実装について


タイトルがわかりにくい言葉になってて申し訳ないです。  
実際の処理とは違うのですが、

[code]

    class Parent
    {
    protected:
        int max = 10;
    
    public:
        void func()
        {
            for (int i = 0; i < max; i++)
            {
                printf("文字列");
            }
        }
    };
    
    class Child : public Parent
    {
        int max = 20;
    };
    
[/code]

のような処理を書いた場合に、このヘッダ(実際にはヘッダとソースで分けてあるので)をincludeし、

[code]

    Child hoge;
    hoge.func()
    
[/code]

のような処理をした場合、Childのmaxは無視され、Parentが本来もっているmaxが使われます。  
処理自体はParentと同じ、ただ同じ名前・同じ型の変数のChildで持っている変数を使わせて処理を行いたい、という場合はどうすればいいのでしょうか?




宣言による変数の上書きはできません。それを行うには`virtual`関数が必要になります。

[code]

    class Parent
    {
    protected:
        int virtual max(){ return 10; }
    
    public:
        void func()
        {
            for (int i = 0; i < max(); i++)
            {
                printf("文字列");
            }
        }
    };
    
    class Child : public Parent
    {
        int max(){ return 20; }
    };
    
[/code]

ですがuser13656さんも指摘されているように変数であればコンストラクターなどで上書きしてしまえばいいでしょう。

[code]

    class Parent
    {
    protected:
        int max = 10;
    
    public:
        void func()
        {
            for (int i = 0; i < max; i++)
            {
                printf("文字列");
            }
        }
    };
    
    class Child : public Parent
    {
    public:
        Child(){ max = 20; }
    };
    
[/code]

しかしこれではmaxの値が分りづらいです。どうせコンストラクターで処理するのであれば値を渡してしまうこともできます。

[code]

    class Parent
    {
    protected:
        int max;
        Parent(int max): max(max){}
    
    public:
        Parent(): max(10){}
        void func()
        {
            for (int i = 0; i < max; i++)
            {
                printf("文字列");
            }
        }
    };
    
    class Child : public Parent
    {
    public:
        Child(): Parent(20){}
    };
    
[/code]

でも最近のC++言語では`virtual`や継承は使わずに`template`を使ったりもします。

[code]

    template<int max = 10>
    class Parent
    {
    public:
        void func()
        {
            for (int i = 0; i < max; i++)
            {
                printf("文字列");
            }
        }
    };
    
    class Child: public Parent<20>{};
    
[/code]

等々、方法はいろいろありますので、状況にあった選択をしてください。

