這裏的一些代碼:使用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對象的外部數據被改變。
重載已經超越了我的想法,但有沒有一種安全的方式來使用someFunction(containerB)已經定義的代碼? – tmaric
如果containerC和containerB具有共同的功能,則應該由containerA中的實現(B和C繼承)中的實現來表示,然後可以由一個採用containerA的someFunction來覆蓋。如果沒有共同的功能,你必須有兩個不同的實現。其他一切都很糟糕。 –