それは私へのポインタの共分散を持つ++そのCを発生したことがないので、あなたは、このような足で自分自身を撮影することができます:それは未定義の動作C++ポインタの共分散
struct Base
{
Base() : a(5) {}
int a;
};
struct Child1 : public Base
{
Child1() : b(7) {}
int b;
int bar() { return b;}
};
struct Child2 : public Base
{
Child2(): c(8) {}
int c;
};
int main()
{
Child1 children1[2];
Base * b = children1;
Child2 child2;
b[1] = child2; // <------- now the first element of Child1 array was assigned a value of type Child2
std::cout << children1[0].bar() << children1[1].bar(); // prints 57
}
ですか?それを防ぐ方法はありますか、少なくともコンパイラからの警告はありますか?
私はゼロ要素b [0]を呼び出すのに慣れています。実際に配列を作ることは必要ではありません。私は単一のChild1 child1を生成することができます。ベース* b =&子1; * b = child2;同じ未定義の動作を取得することはできませんか? – Amomum
いいえ、これは完全に定義された動作です。 –
@Amomum:言うまでもなく、それが定義されているという理由だけでは、それは良い考えではありません。それがあなたが思っていることをしているという意味でもありません。 –