我是靠谱客的博主 友好煎饼,最近开发中收集的这篇文章主要介绍[BlackPearl引擎开发记录 4] ---dynamic_pointer_cast 必须是多态类才能转换,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
类之间必须具有多态属性:即至少含有一个虚函数(非析构虚函数)!!
错误例子:
#include<iostream>
#include<memory>
#include<vector>
#include<string>
class Manager
{
public:
Manager();
~Manager();
private:
};
Manager::Manager()
{
}
Manager::~Manager()
{
}
template<typename C,typename ...Args>
C* AddComponent(Args ...args)
{
Manager *m = new Manager();
C* component = new C(m,std::forward<Args>(args)...);
return component;
}
class BaseComponent {
public:
static int s_FamliyCounter;
int base = 10;
//virtual void ToString(){}
};
int BaseComponent::s_FamliyCounter = 0;
template<typename C>
class Component :public BaseComponent
{
public:
Component() {};
virtual ~Component() = default;
static int Famliy();
};
template<typename C>
int Component<C>::Famliy()
{
static int famliy = s_FamliyCounter++;
return famliy;
}
class Camera :public Component<Camera> {
public:
~Camera() {
std::cout << "delete camera...";
}
std::string m_camera = "Camera";
};
int main() {
std::vector<std::shared_ptr<BaseComponent>> v;
std::shared_ptr<Camera>camera;
camera.reset(new Camera());
v.push_back(camera);
std::shared_ptr<Camera> aa = std::dynamic_pointer_cast<Camera>(v[0]);//出错!!
std::cout << aa->m_camera << std::endl;
std::cin.get();
}
BaseComponent内并没有虚函数,不是一个多态类,使用std::dynamic_pointer_cast时就会出错!
现在给 BaseComponent添加一个虚函数virtual void ToString(){}
class BaseComponent {
public:
static int s_FamliyCounter;
int base = 10;
virtual void ToString(){}
};
dynamic_pointer_cast就能成功把BaseComponent安全转换为Camera类:
输出:
Camera
最后
以上就是友好煎饼为你收集整理的[BlackPearl引擎开发记录 4] ---dynamic_pointer_cast 必须是多态类才能转换的全部内容,希望文章能够帮你解决[BlackPearl引擎开发记录 4] ---dynamic_pointer_cast 必须是多态类才能转换所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复