我是靠谱客的博主 友好煎饼,最近开发中收集的这篇文章主要介绍[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 必须是多态类才能转换所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部