2008-05-26から1日間の記事一覧

仮想関数

C++

virtualをつけないとオーバライドされない、と。 #include <iostream> using namespace std; class Foo { public: void func() { cout << "Foo::func()" << endl; } virtual void vfunc() { cout << "Foo::vfunc()" << endl; } }; class Bar : public Foo { public: vo</iostream>…

仮想関数: キャストしてみる

C++

#include <iostream> using namespace std; class Foo { public: void func() { cout << "Foo::func()" << endl; } virtual void vfunc() { cout << "Foo::vfunc()" << endl; } }; class Bar : public Foo { public: void func() { cout << "Bar::func()" << endl; } v</iostream>…

純粋仮想関数

C++

インスタンス化はできない、と。 #include <iostream> using namespace std; class Foo { public: void func() { cout << "Foo::func()" << endl; } virtual void vfunc() = 0; }; class Bar : public Foo { public: void func() { cout << "Bar::func()" << endl; } v</iostream>…

純粋仮想関数: 0以外にしてみる

C++

コンパイルできず。当たり前か。 でも、変わったシンタックスだなー。 #include <iostream> using namespace std; class Foo { public: void func() { cout << "Foo::func()" << endl; } virtual void vfunc() = 1; }; int main() { return 0; } $ g++ -g foo.cpp -o f</iostream>…

純粋仮想関数: 下に丸投げ

C++

#include <iostream> using namespace std; class Foo { public: virtual void vfunc() = 0; }; class Bar : public Foo { public: virtual void vfunc() = 0; }; class Zoo : public Bar { public: void vfunc() { cout << "Zoo::vfunc()" << endl; } }; int main() {</iostream>…

純粋仮想デストラクタ

C++

http://archive.mag2.com/0000236703/index.html これって定石なのかなぁ? #include <iostream> using namespace std; class Foo { public: virtual ~Foo() = 0; }; Foo::~Foo() {} class Bar : public Foo {}; int main() { Bar bar; return 0; }</iostream>

純粋仮想関数: 参照で操作

C++

できた。 #include <iostream> using namespace std; class Foo { public: virtual void func() = 0; }; class Bar : public Foo { public: void func() { cout << "Bar::func()" << endl; } }; int main() { Bar bar; Foo &foo = bar; foo.func(); return 0; } Bar::f</iostream>…

純粋仮想関数: 使ってみる

C++

使ってみる。 #include <iostream> using namespace std; class Bike { public: virtual void shift_gear() = 0; }; class Suzuki : public Bike { public: void shift_gear() { cout << "スコンスコン" << endl; } }; class Kawasaki : public Bike { public: void sh</iostream>…

汎用関数

C++

テンプレートの展開(?)はコンパイル時、「<>」で明示的に指定できる、と。 #include <iostream> #include <string> using namespace std; template <class X> void func(X &x) { cout << x << endl; } int main() { int i = 100; string s = "foo"; func(i); func<int>(i); func(s); func<string>(s);</string></int></class></string></iostream>…

link: テンプレートあれこれ (4) -- typename の役割

C++

http://www.fides.dti.ne.jp/~oka-t/cpplab-template-4.html staticはCの問題じゃないかなぁ。

汎用関数のオーバーロード

C++

テンプレートの前に関数が定義されていても、隠蔽される、と。 少なくともVCではそうなった。 #include <iostream> #include <string> using namespace std; void func(int &x) { cout << "overload" << endl; } template <class X> void func(X &x) { cout << x << endl; } int main() </class></string></iostream>…

汎用関数について思ったこと

C++

引数の参照渡しのことを考えると、組み込み型とユーザ定義型をまたぐようなテンプレートを作るべきじゃないのかなぁ、など思った。 「func(100)」とかできないのはいやだし、一時オブジェクトのビミョーな動きを考えると、ユーザ定義型はなるべく参照で渡し…