1
#include <iostream>

using namespace std;

template <typename E1, typename E2>
class Mix : public E1, public E2
{
public:
    Mix() : E1(1), E2(2)
    {  
        // Set nothing here
        cerr << "This is " << this << " in Mix" << endl;
        print(cerr);
    }

    void print(ostream& os)
    {
        os << "E1: " << E1::e1 << ", E2: " << E2::e2 << endl;
        // os << "E1: " << e1 << ", E2: " << e2 << endl; won't compile
    }
};

class Element1
{
public:
    Element1(unsigned int e) : e1(e)
    {
        cerr << "This is " << this << " in Element1" << endl;
    }

    unsigned int e1;
};

class Element2
{
public:
    Element2(unsigned int e) : e2(e)
    {
        cerr << "This is " << this << " in Element2" << endl;
    }

    unsigned int e2;
};


int main(int argc, char** argv)
{
   Mix<Element1, Element2> m; 
}

thisさて、2 つのテンプレート パラメーター クラスから同等に継承しているため、2 つのコンストラクターが同じであると期待しますが、そうではありません。実行ログは次のとおりです。

This is 0x7fff6c04aa70 in Element1
This is 0x7fff6c04aa74 in Element2
This is 0x7fff6c04aa70 in Mix
E1: 1, E2: 2

ご覧のとおりthis、Element1 と Mix では同じですが、Element2 ではそうではありません。何故ですか?また、基本クラスから e1 と e2 にアクセスできることも期待しています。この振る舞いを説明できますか?

4

1 に答える 1

1

ElementにはとMixが含まれています。これらは、おそらく実装が特に調整されており、メモリ内に次々に書き込まれます。asを使用する場合、これは 2 つのうちの最初のもの (サイズ) を指し、そのまま使用する場合は 2 番目 (サイズ)を指します。これは s ベース アドレスと同じですが、サイズが異なります (少なくとも のサイズ+ のサイズ)。Element1Element2MixElement1Element1Element2Element2MixElement1Element1Element2

編集:サイズも出力することでこれを確認できます:

#含む

using namespace std;

template <typename E1, typename E2>
class Mix : public E1, public E2
{
public:
    Mix() : E1(1), E2(2)
    {  
        // Set nothing here
        cerr << "This is " << this << " + " << sizeof(*this) << " in Mix" << endl;
        print(cerr);
    }

    void print(ostream& os)
    {
        os << "E1: " << E1::e1 << ", E2: " << E2::e2 << endl;
        // os << "E1: " << e1 << ", E2: " << e2 << endl; won't compile
    }
};

class Element1
{
public:
    Element1(unsigned int e) : e1(e)
    {
        cerr << "This is " << this << " + " << sizeof(*this) << " in Element1" << endl;
    }

    unsigned int e1;
};

class Element2
{
public:
    Element2(unsigned int e) : e2(e)
    {
        cerr << "This is " << this << " + " << sizeof(*this) << " in Element2" << endl;
    }

    unsigned int e2;
};


int main(int argc, char** argv)
{
   Mix<Element1, Element2> m; 
}

出力:

This is 0x7fffc9cad310 + 4 in Element1
This is 0x7fffc9cad314 + 4 in Element2
This is 0x7fffc9cad310 + 8 in Mix
E1: 1, E2: 2
于 2013-07-11T14:52:40.640 に答える