2016-10-02 10 views
0

アップキャスト(親から子へ)に関するstatic_castを理解しようとしています。私には意味がない。私は子供を親に投げ込み、それを実証しなければならない。いくつかのコードをオンラインで参照して本を参照すると、これは私が持っているものです。static_castとその目的をデモンストレーションしますか?

Mustang *myMustang = new Mustang; 
Car *myCar = new Car; 

myMustang = static_cast<Mustang*>(myCar); 

しかし、率直に言っても何も表示されません。私はそれがキャストされたという確証はありません。私は、Carクラスにパブリック関数を追加しようとしましたが、それはその子から呼び出されましたが、明らかに継承されています。

これは、現在、このタイプのアップキャストでは目的が見られないことを意味しています。

私の質問は、これをキャストしてもどうやって検証するのですか。このキャストのタイプ入力の目的は何ですか?

update:このタイプのキャストでは経験がなく、仮想関数があいまいなため、答えは少し難しかったです。私の友人が私を助けてくれました。以下は他の誰かが同じ問題を抱えている場合のコードです。

class Car { 
    public: 
    virtual void Greeting() { cout << "I am a car." << endl; }; 
}; 

class Focus : public Car{ 
    public: 
    void FocusGreeting() { cout << "Hello, I am a Ford Focus." << endl; } 
}; 

class Mustang : public Car { 
    public: 
    virtual void Greeting() override { cout << "I am a Ford Mustang." << endl; } 
}; 

// in main 
Mustang* myMustang = new Mustang; 
Car *myCar = new Car; 

myCar->Greeting(); 
cout << "Now "; 
myCar = static_cast<Car*>(myMustang); 

myCar->Greeting(); 
+1

class S { using FN = void(*)(void*); template<typename T> static void invoke(void *ptr) { static_cast<T*>(ptr)->foo(); } public: template<typename T> static S create(T *t) { S s; s.ptr = t; s.f = &invoke<T>; return s; } void run() { f(ptr); } private: void *ptr; FN f; }; struct A { void foo() {} }; struct B { void foo() {} }; int main() { A a; B b; S s1 = S::create(&a); S s2 = S::create(&b); s1.run(); s2.run(); } 
'Mustang'は、基本クラスである場合を除きこれは未定義の動作です。 –

+2

あなたはダウンキャスティングしていますが、アップキャストしていません。 –

+0

また、派生型によってオーバーライドできる仮想関数を使用してみてください。 –

答えて

1

CRTPパターンの使用例:

#include <type_traits> 
// 
// the general concept of being able to accelerate 
template<class T> 
struct acceleratable 
{ 
    auto accelerate() { 
    static_assert(std::is_base_of<acceleratable<T>, T>::value, ""); 
    // turn this in to a T, since we know that *this really is a T 
    return static_cast<T*>(this)->do_accelerate(); 
    } 
}; 

// 
// something that implementes the concept of being able to accelerate 
struct car : acceleratable<car> 
{ 
private: 
    friend acceleratable<car>; 
    void do_accelerate() 
    { 
    // accelerate implementation here 
    } 
}; 

// 
// free function which accelerates anything that's acceleratable 
template<class Thing> 
auto accelerate(Thing& t) 
{ 
    t.accelerate(); 
} 

int main() 
{ 
    car c; 
    accelerate(c); 
} 
0

使用の別の自明でない例は、タイプ消去ある:

関連する問題