15

次の C++ プログラムについて:

class Base { };

class Child : public Base { };

int main()
{   
    // Normal: using child as base is allowed
    Child *c = new Child();
    Base *b = c;

    // Double pointers: apparently can't use Child** as Base**
    Child **cc = &c;
    Base **bb = cc;

    return 0;
}

GCC は、最後の割り当てステートメントで次のエラーを生成します。

error: invalid conversion from ‘Child**’ to ‘Base**’

私の質問は2つの部分に分かれています:

  1. Child** から Base** への暗黙的な変換がないのはなぜですか?
  2. この例は、C スタイルのキャストまたはreinterpret_cast. これらのキャストを使用することは、すべての型の安全性を捨てることを意味します。これらのポインターを暗黙的にキャストするために、または少なくともstatic_cast代わりに使用できるように変換を表現するために、クラス定義に追加できるものはありますか?
4

2 に答える 2

25

これが許可されている場合は、次のように記述できます。

*bb = new Base;

のインスタンスcを指すことになりますBase。悪い。

于 2010-03-28T09:30:31.513 に答える
1

ポインタは仮想アドレスです。通常、あなたはそれを使って何をするかについて責任があります。msvc 2019 を使用します。1 つをベースにキャストできますが、2 つにはキャストできません。

example 1:

int p;
int *p1 = &p;
int **p2 = &p1; //OK

example 2:

struct xx {};
struct yy : public xx {};

yy p;
yy *p1 = &p;
xx **p2 = &p1; //Just a strange error

example 3:

struct xx {};
struct yy : public xx {};

yy p;
xx *p1 = &p; 
xx **p2 = &p1; //OK
于 2020-05-10T08:41:28.353 に答える