2017-04-19 58 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基因爲我的英文不好,我在俄羅斯版計算器的嘗試,但沒有找到答案 – 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; 
} 

編譯沒有警告,並輸出預期 ...