首页 > 解决方案 > 将子类转换为父类 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

标签: c++classinheritancequeue

解决方案


问题可能与私有继承有关。

#include <iostream>

class A {};

class B: public A {}; //<-- fails to compile if "public" is omitted

int main()
{
  std::shared_ptr<A> a(new B);
}

推荐阅读