class A { public:
virtualvoid f() { Print( __FUNCTION__ ); }
};
class B : public A { public:
virtualvoid f() { Print( __FUNCTION__ ); }
};
class H { public:
H( A* a ) { H::s[ 0 ] = a; }
staticvoid g();
static A* s[ 1 ];
};
A *H::s[ 1 ] = { 0 };
void H::g() { H::s[ 0 ].f(); } //еще обратил внимание, что в этом месте редактор выделяет (.f) зеленым
voidOnStart()
{
A* b = new B();
H h( b );
H::g(); //печатает A::f()
delete( b );
}
仮想関数の 動作にエラーが発生した
結果:A::f()、本来はB::f()のはず。
META TRADER 4をOS MAVERICKSにインストールするのを手伝ってください。すべてのプログラムをダウンロードし、MACでプレイし、すべて新しく、何かはエラーを出します。
/*モデレーター:エラーテキストをファイルとして送信*/
2 - デバッグの前に。
3 - 後です。
もしかしたら、そこに違いがあるのかもしれない、私は全く理解できないが)
ありがとうございました)
コンパイルエラー
constはstaticに従うべきでないが
また、staticは通常のh()関数で変更され、A::f() constはそのことを知らないので、これは見せかけの保護である
仮想関数の 動作にエラーが発生した
結果:A::f()、本来はB::f()のはず。
コンパイルエラー
constはstaticに従うべきでないが
また、staticは通常のh()関数で変更され、A::f() constはそのことを知らないので、これは見せかけの保護である
h( A* a ) を呼び出すすべてのケースでコンパイルエラー 358 が発生する。
h( const A* a)ではないので、(3)と(4)のみで正当化される。
同様の状況は、以前https://www.mql5.com/ru/forum/1111/page1218#comment_1058402 でも修正されていますが、void f() の const 宣言の有無がエラー発生に影響することと、メンバ関数が なかったことが原因だと思われま す。
ビルド976ではコンパイルできません(エラー358、ただし以前説明したビルド975のエラーとは異なる)。
ビルド976では、constクラスのメソッドから 呼び出された通常の関数が、const&以外の参照で渡されたクラスメンバを変更できることに関するエラーが修正されたためと思われます。しかし、ここではポインタはクラスメンバであり、その値は h( A* a ) を呼び出すときには変更されないことが保証されていますが、 h( A* &a ) を宣言するときにのみ変更することが可能です。ビルド976でコンパイルできない(エラー358、ただしビルド975ではエラーが発生しなかった点が前述と異なる)。
ビルド976では、constクラスのメソッドから 呼び出された通常の関数が、const&以外の参照で渡されたクラスメンバを変更できることに関するエラーが修正されたためと思われます。しかし、ここではポインタはクラスメンバであり、その値は h( A* a) が呼ばれたときには変更されないことが保証されていますが、 h( A* &a ) が宣言されたときにのみ変更することが可能です。