2011-11-25 20 views
2

這裏的一些代碼:使用reinterpret_cast的成員函數的參數

class containerA 
{}; 

class containerB 
: public containerA 
{ 
    public: 
     containerB() {}; 

     containerB(const containerB& cb) 
     { 
      cout << "containerB copy ctor" << endl; 
     } 
}; 

class containerC 
: public containerA 
{ 
    public: 
     containerC() {}; 

     containerC(const containerC& cc) 
     { 
      cout << "containerC copy ctor" << endl; 
     } 
}; 

class myType 
{ 
    public: 

     void someFunction(const containerB& cB) 
     { 
      cout << "someFunction(containerB)" << endl; 
     } 
}; 

如果你認爲上面的定義不能改變的,通過什麼樣的機制,纔有可能調用的myType的「someFunction」方法與參數類型爲「const containerC &」?

所有我能找到的公開從派生的myType一個新的類型,並重新定義了「someFunction」使用的reinterpret_cast如下:

class myTypeNew 
: public myType 
{ 
    public: 
     void someFunction(const containerC& cC) 
     { 
      cout << "someFunction(containerC)" << endl; 

      const containerB& cbRef = reinterpret_cast<const containerB&>(cC); 

      myType::someFunction(cbRef); 
     } 
}; 

這安全嗎?我的猜測是,它將取決於containerB和containerC的操作符關於它們在某些函數中的使用方式。

所有容器都是模板化的,但這沒什麼區別,這是一個繼承層次結構問題。

非常重要:由於顯式類型轉換是爲containerB和containerC定義的,因此將containerA作爲參數,我可以將containerC作爲直接參數傳遞給myType :: someFunction,但在這種情況下,複製構造發生,這正是我想要避免的。

一些具體說明:既containerB和containerC的

  • 屬性是完全相同的
  • someFunction僅利用opearator []用於訪問容器的元件,並且
  • 操作者+ =(但此被定義在模板元素級別)

containerB和containerC不是兩個通用的不同類型:containerC只是一些添加的成員函數,沒有int對象的外部數據被改變。

回答

2

不,這是不安全的,我會認爲它是在未定義的行爲範圍內。

類containerB和containerC是兩個不同的類型(除了它們都從containerA繼承)。

所以,唯一的 「合法」 的方式與A一起調用someFunction()用於containerB和containerC將

  • 提供someFunction過載覆蓋類型
  • 提供一個someFunction(containerA & CA)基類containerA內足夠接口
+0

重載已經超越了我的想法,但有沒有一種安全的方式來使用someFunction(containerB)已經定義的代碼? – tmaric

+2

如果containerC和containerB具有共同的功能,則應該由containerA中的實現(B和C繼承)中的實現來表示,然後可以由一個採用containerA的someFunction來覆蓋。如果沒有共同的功能,你必須有兩個不同的實現。其他一切都很糟糕。 –

2

這是不安全的。

someFunction可能會調用是ContainerB(否則,它可能有ContainerA作爲它的參數類型)部分的方法。

如果該方法被調用的對象不是一個ContainerB(因爲它是ContainerC,你只是類型強制轉換的話),可能會發生故障(如試圖訪問不存在的成員變量)。

+0

有containerB和containerC之間沒有什麼不同的成員變量,someFunction調用operator []的和元素(不依賴於這個問題進行算術) – tmaric

+0

有沒有一種方法可以從someFunction(containerB)獲取功能而不用重寫代碼?這兩個容器的代碼完全一樣,完全相同。 – tmaric

1

它通常是不可靠的

  • containerBcontainerA
  • containerCcontainerA

由於公有繼承的定義,但

  • containerB不是一個containerC

所以你不能從一種類型轉換到另一種類型。

也許可以考慮寫一個函數FromCtoB(...)這個函數將給定的containerC所需的元素複製到一個新的containerB
注意,這將是可能只有在情況下,相關數據沒有聲明private

相關問題