2

階層の基本クラスに静的定数を作成した場合、派生クラスでその値を再定義できますか?

編集:

#include <iostream>

class Base
{
public:
  static const int i = 1;
};

class Derived : public Base
{
public:
  static const int i = 2;
};

int main()
{
  std::cout << "Base::i == " << Base::i << std::endl;
  std::cout << "Derived::i == " << Derived::i << std::endl;  

  Base * ptr;

  ptr= new Derived;

  std::cout<< "ptr=" << ptr->i << std::endl;

  return 0;
}

...は、をptr指しますがBase::i、これは望ましくありません。

4

3 に答える 3

4

ptr静的メンバーへのアクセスBase *は、ランタイム型ではなく、宣言された型を介して行われます (場合によってBase *は 、場合によってはDerived *)。これは、プログラムの次の簡単な拡張で確認できます。

#include <iostream>

class Base
{
public:
    static const int i = 1;
};

class Derived : public Base
{
public:
    static const int i = 2;
};

int main()
{
    std::cout << "Base::i == " << Base::i << std::endl;
    std::cout << "Derived::i == " << Derived::i << std::endl;  

    Base *b_ptr = new Derived;
    std::cout<< "b_ptr=" << b_ptr->i << std::endl;

    Derived *d_ptr = new Derived;
    std::cout<< "d_ptr=" << d_ptr->i << std::endl;

    return 0;
}

出力:

Base::i == 1
Derived::i == 2
b_ptr=1
d_ptr=2
于 2012-10-12T05:08:29.010 に答える
3

いいえconst。そのため、値を変更することはできません。

ただし、派生クラスに同じ名前のnewを宣言し、static constそこでその値を定義することができます。

#include <iostream>

class Base
{
public:
  static const int i = 1;
};

class Derived : public Base
{
public:
  static const int i = 2;
};

int main()
{
  std::cout << "Base::i == " << Base::i << std::endl;
  std::cout << "Derived::i == " << Derived::i << std::endl;  
  return 0;
}
于 2012-10-12T04:47:11.167 に答える
0

コンストラクターメンバー初期化リストでconstmemember変数を開始する必要があります。

const変数を変更することはできません。

于 2012-10-12T04:47:07.500 に答える