C++でのDynamic_castとstatic_cast
static_cast: これは、通常/通常の型変換に使用されます。これは、暗黙の型強制の原因となるキャストでもあり、明示的に呼び出すこともできます。 floatをintに、charをintに変換する場合などに使用する必要があります。これにより、関連する型クラスをキャストできます。タイプが同じでない場合、エラーが発生します。
例
#include<iostream>
using namespace std;
class Base {};
class Derived : public Base {};
class MyClass {};
main(){
Derived* d = new Derived;
Base* b = static_cast<Base*>(d); // this line will work properly
MyClass* x = static_cast<MyClass*>(d); // ERROR will be generated during compilation
} 出力
[Error] invalid static_cast from type 'Derived*' to type 'MyClass*'
dynamic_cast :このキャストは、ポリモーフィズムを処理するために使用されます。派生クラスにキャストする場合にのみ使用する必要があります。これは、基本クラスから派生クラスにキャストするときに継承でのみ使用されます。
例
#include<iostream>
using namespace std;
class MyClass1 {
public:
virtual void print()const {
cout << "This is from MyClass1\n";
}
};
class MyClass2 {
public:
virtual void print()const {
cout << "This is from MyClass2\n";
}
};
class MyClass3: public MyClass1, public MyClass2 {
public:
void print()const {
cout << "This is from MyClass3\n";
}
};
int main(){
MyClass1* a = new MyClass1;
MyClass2* b = new MyClass2;
MyClass3* c = new MyClass3;
a -> print();
b -> print();
c -> print();
b = dynamic_cast< MyClass2*>(a); //This cast will be failed
if (b)
b->print();
else
cout << "no MyClass2\n";
a = c;
a -> print(); //Printing from MyClass3
b = dynamic_cast< MyClass2*>(a); //Successfully casting is done
if (b)
b -> print();
else
cout << "no MyClass2\n";
} 出力
This is from MyClass1 This is from MyClass2 This is from MyClass3 no MyClass2 This is from MyClass3 This is from MyClass3
-
static_cast、dynamic_cast、const_cast、およびreinterpret_castをC ++で使用する必要があるのはいつですか?
const_cast constを削除したり、変数に追加したりするために使用できます。これは、変数から定数を追加/削除する必要がある場合に役立ちます。 static_cast これは、通常/通常の型変換に使用されます。これは、暗黙の型強制の原因となるキャストでもあり、明示的に呼び出すこともできます。 floatをintに、charをintに変換する場合などに使用する必要があります。 dynamic_cast このキャストは、ポリモーフィズムを処理するために使用されます。派生クラスにキャストする場合にのみ使用する必要があります。これは、基本クラスから派生クラスにキャストするときに継承
-
C++でのフレンドクラスと関数
クラスのフレンド関数はそのクラスのスコープ外で定義されていますが、クラスのすべてのプライベートメンバーと保護されたメンバーにアクセスする権利があります。フレンド関数のプロトタイプはクラス定義に表示されますが、フレンドはメンバー関数ではありません。 フレンドは、関数、関数テンプレート、メンバー関数、またはクラスまたはクラステンプレートにすることができます。この場合、クラス全体とそのすべてのメンバーがフレンドになります。 関数をクラスのフレンドとして宣言するには、次のように、クラス定義の関数プロトタイプの前にキーワードfriendを付けます- class Box { double width;