我的代碼看起來像這樣:
class A {
...
};
template<typename T>
class B: public A {
...
};
A* pointerA = new B<X>(...);
但現在我想將另一個指標 B 轉換為指標 A:
B<...>* pointerB = (B<...>*)pointerA;
我怎么知道要插入什么 <...> 或者我應該如何正確地做到這一點?
uj5u.com熱心網友回復:
您可以嘗試使用dynamic_cast. 如果你dynamic_cast指向一個指標型別并且它失敗了,你會得到一個空指標。如果您dynamic_cast使用一個參考型別并且它失敗了,您將收到一個例外。
例子:
#include <iostream>
class A {
public:
virtual ~A() = default;
};
template<typename T>
class B : public A {};
int main() {
A* pointerA = new B<int>;
auto pointerB = dynamic_cast<B<double>*>(pointerA);
if(pointerB) {
std::cout << "cast succeeded\n";
} else {
std::cout << "cast failed\n"; // will print "cast failed"
}
delete pointerA;
}
如果您將其中的許多存盤在 a 中vector,則需要測驗所有可能的型別才能轉換回原始型別。
例子:
#include <iostream>
#include <memory>
#include <string>
#include <vector>
class A {
public:
virtual ~A() = default;
};
template<typename T>
class B : public A {};
int main() {
std::vector<std::unique_ptr<A>> vec;
vec.emplace_back(new B<int>);
vec.emplace_back(new B<std::string>);
for(auto& ptr : vec) {
if(auto b = dynamic_cast<B<int>*>(ptr.get())) {
std::cout << "B<int>\n";
} else if(auto b = dynamic_cast<B<std::string>*>(ptr.get())) {
std::cout << "B<std::string>\n";
} else {
std::cout << "Oh, unknown derived type stored ...\n";
}
}
}
最好將virtual方法添加到基類并在派生類中實作它們,而根本不必進行這種轉換。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/325432.html
標籤:C
上一篇:如何正確多載流運算子?
