将基类的指针转换为带有模板的继承类的指针

  • 本文关键字:指针 继承 基类 转换 c++
  • 更新时间 :
  • 英文 :


我的代码看起来像这样:

class A {
...
};
template<typename T>
class B: public A {
...
};
A* pointerA = new B<X>(...);

但是现在我想将另一个指针b转换为指针a:

B<...>* pointerB = (B<...>*)pointerA;

我怎么知道插入什么到<…>或者我应该如何正确地做这件事?

您可以尝试使用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 succeededn";
} else {
std::cout << "cast failedn";      // will print "cast failed"
}
delete pointerA;
}

如果您在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方法添加到基类中,并在派生类中实现它们,这样根本不必进行这种强制转换。