1

私は持っています:

VirtualClass : public QObject
{
public:
    int m_number;
}

DerivedClass : public VirtualClass 
{
public:
    DerivedClass(int number) : m_number(number) {};
    int m_number;
    // some content goes here..
}

クライアントコード:

f(VirtualClass* instance)
{
std::cout << instance->m_number;
}

DerivedClass der(100);

DerivedClassに関連するm_numberf(der)を返したいのですが、*VirtualClassのm_numberを取得します*。私が間違っているのは何ですか?!!

4

3 に答える 3

4

から削除int m_number;DerivedClassます。それ以外の場合は、別m_numberのメンバーにする必要があります。1 つは からVirtualClass、もう 1 つは からDerivedClassです。

あなたが隠すのを追加するint m_number;DerivedClassm_number;VirtualClass

これがどのように機能するかの例を次に示します。

struct Foo
{
    int a;
};

struct Bar : Foo
{
    int a; //another a
};

int main()
{
    Bar *f = new Bar();
    f->a = 10; //Bar::a

    Foo *b = f;
    b->a = 20; //Foo::a

    cout << f->a << endl; //prints 10
    cout << b->a << endl; //prints 20
}
于 2012-08-15T13:59:37.693 に答える
2

あなたはint m_number;2回宣言しました。一度だけ宣言する必要があります。

于 2012-08-15T14:01:20.997 に答える
2

spin_eight: 必要に応じて、VirtualClass に適切なコンストラクターを提供し、次のように派生した初期化子リストから呼び出すことで、初期化子リストを保持できます。

VirtualClass : public QObject 
{ 
 public: 
 VirtualClass(int number) : m_number(number) { }
 int m_number; 
}

DerivedClass : public VirtualClass
{
 public: 
 DerivedClass(int number) : VirtualClass(number) {}; 
 // some content goes here.. 
} 
于 2012-08-15T14:46:16.683 に答える