0

私は少しポリモーフィズムを知っていますが、ここでは少し迷っています.fromメソッドへの暗黙的な変換がB呼び出されますが、メソッドfromが明示的に呼び出されます。これは理にかなっていますが、メソッドは仮想であり、それ以外の場合はどちらも入力です (クラスのメソッドが呼び出されます)。ABAShowAA

class A
{
public:
    A(){};
    ~A(){}
public:
    int n;
      virtual void Show(){ cout << "ShowA" << endl;  };
};

class B : public A
{
public:
    B(){};
    ~B(){}
     virtual void Show() { cout << "ShowB" << endl; }
};


int _tmain(int argc, _TCHAR* argv[])
{
    B b;
    A& a = b; //ShowB
    A& a = (A)b; //ShowA
    a.Show();

    //Extra:
    A& extra = extra;

    return 0;
}

また、禁止されていないのには何か理由があるのA& extra = extraでしょうか、それとも単純に禁止されている意味のないことの重要性がほとんどないからですか?

4

1 に答える 1

2
A& a = (A)b;

これにより、 タイプ の一時オブジェクトが作成され、Aの基本クラス部分がコピーされbます。次に、この一時への参照を取得しようとします。

幸いなことに、C++ 言語では一時オブジェクトへの (非定数の) 参照を使用できないため、この種の間違いを誤って犯すことはありません。

残念ながら、コンパイラはそれを可能にする「言語拡張機能」を提供しているため、そのコンパイラを使用する必要がある場合は、より注意する必要があります。

一般に、疫病のような C スタイルのキャストは避けてください。本当に明示的な変換が必要な場合は、可能な限り制限の厳しい C++ スタイルのキャストを使用して、コンパイラがエラーをキャッチできるようにします。

また、禁止されていないのには何か理由があるのA& extra = extraでしょうか、それとも単純に禁止されている意味のないことの重要性がほとんどないからですか?

それが許可される正当な理由はありません。int i, &r=i;おそらく、またはのような正当な宣言を禁止せずに禁止するのはかなり複雑になるため、禁止されていません。void *p = &p;

于 2013-03-04T01:37:17.323 に答える