1

基本クラスと、複数のインスタンスを持つことができるいくつかの派生クラスがあります。派生クラスには、国籍名が格納される静的文字列があります。このように見えます...

// Base Class
class Person{
    private:
        // Informations that every person has. Not depending on the nationality
        unsigned char m_size;
        char[] m_name;

    public:
        // Get the human readable name of a nationality
        void getNationalityName(char* pNatiName);
}

void Base::getNationalityName(char* pNatiName);
{
    strcpy(pNatiName, m_nationalityName);
}


// A derived class
class American : public Person{
    private:
        unsigned int m_dollar;
        static char[] m_nationalityName;
}

// Another derived class
class Russian : public Person{
    private:
        unsigned int m_rubel;
        static char[] m_nationalityName;
}

派生クラスの 1 つからメソッド「getNationalityName」で国籍名にアクセスしたいと思います。問題は、基本クラスが、派生クラスに "m_nationalityName" というプロパティがあることを認識していないことです。

各クラスに「getNationalityName」メソッドを実装できますが、それはこの問題を解決する正しい方法ではないと思います。

4

5 に答える 5

1

ポリモーフィズムを使用します。関数getNationalityNamevirtual作成し、派生クラスで再定義して、目的の文字列を返します。毎回、派生クラスの関数が呼び出され、対応するクラスの文字列が返されます。

//base class:
class Person{
    <...>

    public:
        virtual void getNationalityName(char* pNatiName);
}

<...>

// A derived class
class American : public Person{
    public:
        void getNationalityName(char* pNatiName)
        {
            strcpy(pNatiName, m_nationalityName);
        }
    private:
        unsigned int m_dollar;
        static char[] m_nationalityName;
}

<...>

int main()
{
    Person * p = new American();
    p->getNationalityName(<...>); // calls American::getNationalityName name even though p is a pointer to the base class.
}
于 2013-08-30T06:37:22.890 に答える
1

m_nationalityName基本クラスに入れる必要があるように聞こえますperson。私にとって、国籍は属性のようなものですpersonstaticすべての人に同じ国籍を共有させたくないので、それをしないでください.

于 2013-08-30T06:41:42.520 に答える