0

私はこの簡単なコードを持っています:

class A {
public:
   string toString() const { return "A"; }
};

class B : public A {
public:
   string toString() const { // some code here }
};

toString()クラス B がクラス A から継承され、いくつかの追加の値が必要です。この例では、次のようになります: "AB" (A: クラス A から、B: 追加の文字列)。

これは Java では簡単ですが、C++ ではどうすればよいかわかりません。私の最初のアイデアはtoString()、クラス A から文字列を取得し、追加の文字列を追加することです。だから、これを取るために:私は使用します: static_cast<A>(const_cast(this))->toString()しかし、それは動作しません:(

私を助けてください。ありがとう :)

4

3 に答える 3

4
class A {
public:
   string toString() const { return "A"; }
};

class B : public A {
public:
   string toString() const { return A::toString() + "B"; }
};

MS 実装 (Windows 上) では、代わりに __super::toString() を実行できますが、これは移植性のない MS 拡張です。

于 2012-11-21T19:58:08.903 に答える
2
string B::toString() const {
   string result = A::toString();   // calls the member method in A
                                    // on the current object
   result += "B";
   return result;
}

関数呼び出しの修飾によって、どの関数オーバーライド (関数がポリモーフィックである場合) が呼び出されるかが決まります。これにより、動的ディスパッチがB::toString()再びディスパッチされないことが保証されます。Java との主な違いは、C++ では多重継承が可能であるためA::、単に を呼び出すのではなく、ベースに名前を付ける必要があることsuperです。

于 2012-11-21T19:57:56.293 に答える
1

まず第一に、おそらく toString を仮想にしたいでしょう。次に、目的を達成するために、B::toString で次のようにすることができます。

class B : public A
{
    ...
    virtual string toString() const
    {
        string s = A::toString();
        s += "B";
        return s;
    }
    ...
于 2012-11-21T20:00:34.657 に答える