1

仮想関数の働きを学びました: 継承されたクラスが基本クラスから関数を継承し、それがそれぞれのクラスに合わせてカスタマイズされている場合、これらの関数を基本クラスを指すポインターで次のように呼び出すことができます。

BaseClass* PointerName = &InheritedClassObject;

しかし、変数はどうですか?サイトで次のような質問を見つけました: I can't create virtual variables in C++. 私の経験はそれを証明しています: 変数の場合、Visual C++ は言う: 'virtual' is not allowed .

では、基底クラスのポインターを使用して、継承されたクラスに属する (n 継承された) 変数の値に到達する方法は何ですか?

4

3 に答える 3

1

基本クラスにキャストバックされている場合、継承されたクラスの関数、データ メンバーは使用できません。ただし、これらの変数は仮想関数で変更できます。例:

#include <iostream>

class BaseClass {
public:
  BaseClass() {}
  virtual void do_smth() = 0;

private:
};

class InheritedClass: public BaseClass {
public:
  InheritedClass(): a(1) {}
  virtual void do_smth() { std::cout << ++a << std::endl; }
private:
  int a;
};

int main() {
  BaseClass* ptr = new InheritedClass();
  ptr->do_smth();
  return 0;
}

このコードでは、仮想関数は InheritedClass に属する変数を変更しました。

于 2013-07-20T22:10:37.380 に答える
1

あなたのコメントに基づいて、子クラスが親の変数にどのようにアクセスするかを尋ねようとしていると思います。次の例を検討してください。

class Parent 
{
public:
  Parent(): x(0) {}
  virtual ~Parent() {}

protected:
  int x;
};

class Child: public Parent
{
public:
  Child(): Parent(), num(0) {}

private:
  int num;
};

void Child::foo() 
{
  num = x; //Gets Parent's x, 
}

注意:
x in を定義すると、 inChildがマスクxされParentます。したがって、 x を で取得したい場合は、次のParentものが必要になりますParent::x。から単純に取得xするには、 if isChild cを使用するか、 isまたはの場合に getterを使用します。c.xxpublicxprotectedprivate

int Child::getNum()
{
     return num;
}
于 2013-07-20T22:08:53.057 に答える