0

C ++でのキャストについて疑問があります。例を通して説明します。2 つのクラスがあるとします。

class c1 {
  public:
  c1() {}

  double getHi() { return _hi; }  

private:
  double _hi = 2;
}

class c2 : c1 {
  public:
  c2() {}
} 

c2 は c1 の子であるため、関数 getHi() を継承します。したがって、c2 のインスタンスで getHi を呼び出すことができます。

でもこれ作ったらどうなるの?:

c2* b = new c2();
cout << b->getHi() << endl;
cout << ((c1*)b)->getHi() << endl;

最初のものは機能します。しかし、2番目のものではありません。どうしてこれなの?誰でも私に説明できますか?

ありがとう

編集:それは例でした。書きながらタイプミスしました。

4

3 に答える 3

2

c2はc1の子であるため、関数getHi()を継承します。

まず、c2「から派生する」、「の派生クラスである」、または「から継承する(あなたの場合は)」と言う必要がありますc1。また、「継承」は正しい動詞です。

しかし、これを行うとどうなりますか?

この場合、からプライベートに継承するため、キャストを実行できませんc1。の定義をc2次のように変更すると、まったく同じように機能する2つの呼び出しが表示されますgetHi()(この場合)。

class c2 : public c1 { };
//         ^^^^^^
//         This means that public members of c1 will become
//         public members of c2 as well. If you specify nothing,
//         public members of c1 will become private members of
//         c2 

クラス定義の後にセミコロンがないことにも注意してください。最も重要なのは、およびpublicの定義にアクセス修飾子がないことです。これらがないと、コンストラクターがになり、これらのクラスをインスタンス化できなくなります。c1c2private

class c1
{
public: // <== Don't forget this!
  c1() {} // Btw, why this? It does nothing
  double getHi() { return _hi; }
private:
  double _hi = 2;
}; // <== Don't forget this!

class c2 : public c1
//         ^^^^^^ Don'f forget this!
{
public: // <== Don't forget this!
    c2() {} // Btw, why this? It does nothing
}; // <== Don't forget this!

int main()
{
    c2* b = new c2();
    b->getHi();          // Compiles, calls c1::getHi();
    ((c1*)b)->getHi();   // Compiles, calls c1::getHi();
}
于 2013-03-05T15:33:53.727 に答える
0

C++コードでCスタイルのキャストを使用するには不適切な形式です。代わりにstatic_cast<>またはおそらくdynamic_cast<>を使用してください。それを超えて、あなたはあなたの例のc1から個人的に継承しました。次のように変更した場合:

class c2 : public c1 {

おそらくもっとうまくいくでしょう。

于 2013-03-05T15:34:11.467 に答える
0

あなたが宣言した方法c2c1、のプライベートベースを作成します。このため、c1外部コードはキャストできません。bc1

修正するにはc1、公開ベースを作成します。

class c2: public c1 {
    ...
};
于 2013-03-05T15:32:24.340 に答える