1

私はbaseClassというクラスを使用しており、そこから別のクラスderivedClassを派生させています。私には、他の人とは別に、次のような問題の定義があります。

i)メンバー-オブジェクト初期化子は、基本クラスで宣言されているデータメンバー(var1など)を初期化するために使用する必要があります。

ii)i)基本クラスコンストラクター内で実行されます。これは、派生クラスのコンストラクターを介してのみ呼び出す必要があると言われています。

iii)基本クラスは抽象クラスであり、そのオブジェクトは作成できません。しかし、私には3番目のクラスがあり、その中で次を使用します。

baseClass *baseObjects[5];

コンパイラはエラーを報告しません。

は、i)とii)が本当に何を意味するのか理解していません。簡単な言葉での説明でいいでしょう。また、iii)に関する支援は大歓迎です。

4

4 に答える 4

3

質問 1: コンストラクターについて読む: http://www.cprogramming.com/tutorial/constructor_destructor_ordering.html

質問 2: 初期化リストについて読む:
http://www.cprogramming.com/tutorial/initialization-lists-c++.html

質問 3: 派生クラスへのポインターについて読む:
http://www.learncpp.com/cpp-tutorial/121-pointers-and-references-to-the-base-class-of-derived-objects/

あなたの質問に答えるだけでなく、何が起こっているのかを理解できると思います。

于 2012-09-14T18:22:26.273 に答える
2

イラストが一番いいと思います。

私)

class A
{
  int i;
 public:
  A(int ii) : i(ii) {}
}

この部分i(ii)は、メンバーの例です-オブジェクト初期化子。C ++は、コンストラクター本体が入力される前にメンバーのすべてのコンストラクターが呼び出されることを保証するため、これが、各メンバーに対して呼び出すコンストラクターを指定する唯一の方法です。

ii)C++にはsuperキーワードはありません。基本クラスは次のように指定する必要があります。

 class B : public A
 {
 public:
   B(int i) : A(i) {}
 }

これは、C++で複数の継承が許可されていることが一因です。

iii)オブジェクトは作成しておらず、オブジェクトへのポインタのみを作成していることに注意してください。そして、この方法によって、継承によるポリモーフィズムがC++で実現されます。

于 2012-09-14T18:15:20.417 に答える
2
#include <iostream>

class Base
{
public:
    Base(int i)
    {}

    virtual ~Base() = 0
    {}

protected:
    int i_;
};

class Derived: public Base
{
public:
    Derived(int i, int j) : Base(i), j_(j)
    {}

private:
    int j_;
};

int main(int argc, char* argv[])
{
    //Base b(1); object of abstract class is not allowed
    Derived d(1, 2); // this is fine
}

ご覧のとおり、i_は、Baseクラスコンストラクターを呼び出すことにより、Derivedクラスによって初期化されています。デストラクタの=0は、Baseクラスが純粋な仮想であることを保証するため、インスタンス化できません(メインのコメントを参照)。

于 2012-09-14T18:18:32.923 に答える
2

i) 以下は初期化子リストと呼ばれるものです。初期化子リストを使用して、コンストラクターに入る前にデータ メンバーに値があることを確認できます。したがって、次の例でaは、コンストラクターに入る前に値が 10 になります。

Class baseClass
{
    int a;
public:
    baseClass(int x):a(x)
    {
    }
}

ii) これは、派生クラス コンストラクターから基本クラス コンストラクターを明示的に呼び出す方法です。

Class derivedClass : public baseClass
{
    int a;
public:
    derivedClass(int x):baseClass(x)
    {
    }
}

iii) 抽象クラスのインスタンスを直接作成することはできません。ただし、抽象基本クラスへのポインターを作成し、それらのポインターがその具体的な実装のいずれかを指すようにすることができます。したがって、抽象基本クラスBirdと具象実装がParrotありSparrow、どちらも鳥であるため、またはインスタンスBird* birdのいずれかを指すことができる場合。ParrotSparrow

于 2012-09-14T18:22:01.143 に答える