c++ - 将子类转换为父类 C++
问题描述
我有以下父类:
namespace dataserver {
class Request_manager {
public:
class Ticket {
public:
virtual void start(){};
virtual ~Ticket();
explicit Ticket(System_time start_time);
protected:
System_time const& start_time() const { return m_start_time; }
System_time m_start_time;
private:
std::time_t m_key;
std::size_t m_request_id;
};
static int num_connected() { return m_connected; }
private:
static int m_connected;
};
} // namespace dataserver
#endif // _DATASERVER_REQUEST_MANAGER_H_
还有一个子类:
namespace dataserver {
namespace pointdata {
class Ticket : Request_manager::Ticket,
public std::enable_shared_from_this<Ticket> {
public:
Ticket(Batch_request rq, Data_interface* dataserver,
xxx::service::Service_ticket tix, System_time start_time);
void start();
private:
void serialize(std::vector<Future<Group_result>> data_f);
void failed(std::exception_ptr error);
};
}
} // namespace dataserver::pointdata
#endif // _DATASERVER_POINTDATA_TICKET_H_
我有来自 Request_manager 的其他子类,我想将它们完全保存在队列中。假设我不需要创建父类的任何对象。为了做到这一点,我有一堂课Tickets_Queue
using namespace dataserver;
class Tickets_Queue{
private:
std::queue <std::shared_ptr<Request_manager::Ticket>> m_ticket_queue;
public:
Tickets_Queue();
~Tickets_Queue();
void push(std::shared_ptr<Request_manager::Ticket> ticket);
};
#endif /* _TICKETS_QUEUE_H_ */
为了推动我所做的不同类型的孩子:
std::shared_ptr<Request_manager::Ticket> ticket = std::make_shared<Ticket>(...,
..., ..., ...);
ticket_queue_->push(ticket);
这给了我错误:
error: conversion from ‘std::shared_ptr<dataserver::pointdata::Ticket>’ to non-scalar type ‘std::shared_ptr<dataserver::Request_manager::Ticket>’ requested
编辑
试试这个: std::shared_ptr upcasting to base class - 最好的方法? 仍然给我同样的错误:
error: conversion from ‘std::shared_ptr<dataserver::pointdata::Ticket>’ to non-scalar type ‘std::shared_ptr<dataserver::Request_manager::Ticket>’ requested
解决方案
问题可能与私有继承有关。
#include <iostream>
class A {};
class B: public A {}; //<-- fails to compile if "public" is omitted
int main()
{
std::shared_ptr<A> a(new B);
}
推荐阅读
- c++ - 递归函数中的Qvector崩溃随机
- python - Python - Series Objects are Mutable - Address Parsing
- android - Android navigation component perform an Action when popping backstack
- firebase - How to update an array item in Firestore
- php - Is there a HTTP header size limit that triggers prevent header already sent?
- javascript - 使用 Google Apps 脚本通过 Google Classroom API 使用 course.coursework.list 列出作业
- continuum - 如何卸载 Continuum
- flexbox - Flex with a taller left column and right column that fills with smaller items
- java - 将 JSON“子数组”传递给另一个 Activity
- javascript - Why are my Associations not being recognized and causing a SequelizeEagerLoadingError?