省略時解釈が仮想関数な言語では意味合い的には1つに限られますが
C++ は非仮想なのでオーバーライドの解釈は難しくなっています。
ISO14882:1998 では override と hide が使い分けられているので
(7.3.3-12 とか)
仮想な場合だけ言うのが正しいのかもしれません(調べきれていません)
>virutalな関数じゃないとオーバーライドとは呼ばないのですね。
virtualがないのでCDropComboBox::AddStringとCComboBox::AddStringは
ちがうものです。
CComboBox::AddStringが単に見えてないだけで
CDropComboBoxのインスタンスからでも
m_combo.CComboBox::AddString(");
のように明示的に呼ぶことが可能です。
こんなページありました。
http://www.fides.dti.ne.jp/~oka-t/cpplab-hide-overload.html
ちなみにC#ではvirtualなメソッドであっても
overrideキーワードとnewキーワードの
使い分けができます。
http://msdn2.microsoft.com/ja-jp/library/6fawty39.aspx
>virutalな関数じゃないとオーバーライドとは呼ばないのですね。
virtualがないのでCDropComboBox::AddStringとCComboBox::AddStringは
ちがうものです。
CComboBox::AddStringが単に見えてないだけで
CDropComboBoxのインスタンスからでも
m_combo.CComboBox::AddString(");
のように明示的に呼ぶことが可能です。
こんなページありました。
http://www.fides.dti.ne.jp/~oka-t/cpplab-hide-overload.html
ちなみにC#ではvirtualなメソッドであっても
overrideキーワードとnewキーワードの使い分けができます。
http://msdn2.microsoft.com/ja-jp/library/6fawty39.aspx
2回送信されてしまいましたm(_ _)m
質問から横にそれてますけど
雑談のほうでしたら?
>// ポインタとするのはなぜ?
単に->を使ってアクセスするから?
>// ここでカウントアップした f はどうなる?
クラスFOOのm_iの値プラス1
>// b.Test2(); とどうちかう?
同じでは?
> 単に->を使ってアクセスするから?
> 同じでは?
もっとも、C/C++言語のキモである部分が理解できていないようですけど。
int main()
{
Foo f;
Bar b;
b.m_Foo = &f;
b.Test1(); // b.Test2(); ここを変えてprinfで表示される値を確認してみてくだ
さい。
prinf( b.m_Fooのm_iの値は%d\n, f.m_i );
return 0;
}
別サンプル)
void swap( int x, int y )
{
int temp;
temp = x;
y = temp;
}
int main()
{
int x = 10, y = 20;
swap( x, y );
// この結果はどうなりますか?
// また、本当にxとyの値を変えたいときどうすればいいでしょうか?
}
> prinf( b.m_Fooのm_iの値は%d\n, f.m_i );
まちがいました
printf( b.m_Fooのm_iの値は%d\n, b.m_Foo.m_i );
> printf( b.m_Fooのm_iの値は%d\n, b.m_Foo.m_i );
ごめんなさい。orz
printf( b.m_Fooのm_iの値は%d\n, b.m_Foo->m_i );
何度もスイマセン。
void swap( int x, int y )
{
int temp;
temp = x;
x = y; // 抜けてました。
y = temp;
}
ここが理解できない場合、
http://www9.plala.or.jp/sgwr-t/c/sec10.html
から学習しなおして下さい。
>void swap( int x, int y )
>{
> int temp;
> temp = x;
> x = y; // 抜けてました。
> y = temp;
>}
>int main()
>{
> int x = 10, y = 20;
> swap( x, y );
> // この結果はどうなりますか?
> // また、本当にxとyの値を変えたいときどうすればいいでしょうか?
>}
Ans.
メイン内のx,yの値は変わりません。
swap()内では
x=20, y=10です。
>// また、本当にxとyの値を変えたいときどうすればいいでしょうか?
void swap( int* x, int* y )
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
int main()
{
int x = 10, y = 20;
swap( &x, &y );
// x=20, y=10
}
ですよね?
ということはポインタは理解できていますよね?
class Hoge{
public:
int m_i;
void CountUp () { m_i++; }
};
int main(){
int n = 10;
Hoge h;
h.m_i = n;
h.CountUp();
reutrn 0;
}
と
class Hoge{
public:
int* m_i;
void CountUp () { ( *m_i )++; }
};
int main(){
int n = 10;
Hoge h;
h.m_i = &n;
h.CountUp();
reutrn 0;
}
の違いは説明できますか?
ポインタはいちお理解できてるつもりです。
>の違いは説明できますか?
結果は同じになるはずです。
上はm_iに10を代入し、CountUp()内でプラス1してます。
下はm_iはINT型ポインタなのでnのアドレスを代入し、
CountUp()内ではm_iが差すアドレスの中身をプラス1してます。
> 結果は同じになるはずです。
では、return 0;のまえで
printf( n = %d\nhのm_n = %d\n, n, h.m_i );
// したは *h.m_i
として表示される値が違いますが、どうしてでしょうか?
>として表示される値が違いますが、どうしてでしょうか?
CountUp()内でプラス1してるから。
nの値はm_iに代入してるだけで変化なし