2017-04-19 2 views
0

私はそのような型キャストを行うと例外をスローする必要があります:(B*)aここで、aは基本クラスAのオブジェクトへのポインタであり、Bは派生クラスです。型キャストオーバーロード

class A 
{ 
    protected: 
     int a; 
    public: 
     operator B*() 
     { 
      throw(1); 
     } 

}; 

class B: public A 
{ 
protected: 
    int b; 
}; 

void main() 
{ 
    A *a; 
    (B*)a; 
} 

オーバーロードが試行されますが、Aへのポインターでは機能しません。オブジェクトで動作します。どのように私の基本クラスへのポインタで動作するようにこの操作をオーバーロードするには?

+0

私の下手な英語のためのSRYは、私はstackoverflowのロシア語版で試してみましたしかし、あなたは答えをfoudにしないでください – andybelous2

+0

なぜこれをしたいですか?それにもかかわらず、実際には 'A'は' A'ではなく 'A'でなく、' A * 'の'演算子B * 'をオーバーロードすることはできません。 –

+0

@VittorioRomeo私はこのために型キャストを行うときに例外をスローすることです。クラスBは派生しなければならず、クラスAは基本クラスでなければなりません。オーバーロードを使用する必要があるとは言いませんでしたが、作業。 – andybelous2

答えて

0

カスタムコンバータは、クラス用ではなく、ポインタ用にのみ提供できます。しかし、ポインタを模倣するクラスを作成することができます(これは、スマートポインタの動作です)。ここで

ようなクラスの例である:

#include <iostream> 

class A 
{ 
protected: 
    int a; 
public: 
    int getA() { 
     return a; 
    } 
    virtual ~A() {} // intended to be derived 
}; 

class B; // forward declaration 

class Astar { // mimics a A* 
private: 
    A* pa; 
public: 
    Astar(A* p): pa(p) {} 
    A* operator ->() { 
     return pa; 
    } 
    operator B*(); // declare the custom conversion operator 
    A& operator *() { 
     return *pa; 
    } 
}; 

class B: public A 
{ 
protected: 
    int b; 
public: 
    B(int a, int b): b(b) { 
     A::a = a; 
    } 
    int getB() { 
     return b; 
    } 
}; 

Astar::operator B*() {   // defines the custom conversion 
    return dynamic_cast<B *>(pa); 
} 

int main() 
{ 
    B b(1,2); 
    Astar x(&b);  // x acts exactly as a A* would: 
    std::cout << x->getA() << " - " << (*x).getA() << std::endl; 

    B* pb = x;   // conversion to a plain B* is automatic 
    std::cout << pb->getB() << std::endl; 
    return 0; 
} 

は警告を出力せずにコンパイルし、予想通りされています...

関連する問題