C++ 类中方法的受保护问题
我有一个C++ 类中方法的受保护问题,c++,nested,virtual,protected,C++,Nested,Virtual,Protected,我有一个Request\u manager类,其中包含嵌套类: class Request_manager { public: class Ticket { protected: explicit Ticket(System_time start_time); virtual void start() = 0; } struct ticket_element_{
Request\u manager
类,其中包含嵌套类:
class Request_manager {
public:
class Ticket {
protected:
explicit Ticket(System_time start_time);
virtual void start() = 0;
}
struct ticket_element_{
int app;
std::shared_ptr <Ticket> ticket;
};
class Tickets_Queue{
private:
std::queue <ticket_element_> m_queue;
public:
void push(ticket_element_ ticket);
};
};
ticket\u元素
可以保存来自Request\u manager::ticket
的不同子元素。在Request\u manager::Tickets\u Queue::push的实现中,我执行以下操作:
void Request_manager::Tickets_Queue::push(ticket_element_ ticket_container){
run_async(ticket_container.app, async::Policy::FIFO,
[ticket_container]() { ticket_container.ticket->start(); });
}
我得到一个错误:
In file included from data_interfaces/Request_manager.cpp:1:0:
data_interfaces/Request_manager.h: In lambda function:
data_interfaces/Request_manager.h:31:22: error: ‘virtual void dataserver::Request_manager::Ticket::start()’ is protected
virtual void start() = 0;
^
data_interfaces/Request_manager.cpp:66:67: error: within this context
[ticket_container]() { ticket_container.ticket->start(); });
我不理解这一点,因为在ticket\u container.ticket->start()中拥有对象后,我应该能够访问受保护的方法
您正试图从共享指针访问受保护的方法,该指针在基类请求管理器::Ticket
中没有访问权限,因此无法应用vtable
如果将请求管理器::票证中的受保护的更改为公共,它将工作,因为它可以访问该方法并应用vtable
,从而调用派生的票证
我添加/更改了一些内容,以便能够复制:
class Request_manager
{
public:
class Ticket {
protected:
explicit Ticket() {}
~Ticket() {}
public:
virtual void start() = 0;
};
struct ticket_element_{
int app;
std::shared_ptr <Ticket> ticket;
};
class Tickets_Queue{
private:
std::queue <ticket_element_> m_queue;
public:
void push(ticket_element_ ticket);
};
Tickets_Queue _queue;
};
class Ticket : public Request_manager::Ticket,
public std::enable_shared_from_this<Ticket>
{
public:
void start() {
cout << "Starting ticket" << endl;
}
};
void Request_manager::Tickets_Queue::push(ticket_element_ ticket_container){
ticket_container.ticket->start();
}
int main() {
Request_manager rm;
rm._queue.push ({0, make_shared<Ticket>()});
return 0;
}
为什么你认为Request\u manager::Tickets\u Queue
应该能够访问Request\u manager::Ticket
的受保护成员?“我忘了说Ticket是Request\u manager的子类”,然后请显示你的真实代码:@HectorEsteban,这完全不相关<代码>请求管理器::票证队列
不是从请求管理器::票证
继承的,因此,它不能调用其受保护的成员函数。@HectorEsteban实际上,您是。您正试图从请求管理器::票证\u队列::推送
@HectorEsteban调用受保护的成员函数。不,不应该这样做。除了对类型为Ticket
的对象调用之外,如何调用start
?这在这里无关紧要。
class Request_manager
{
public:
class Ticket {
protected:
explicit Ticket() {}
~Ticket() {}
public:
virtual void start() = 0;
};
struct ticket_element_{
int app;
std::shared_ptr <Ticket> ticket;
};
class Tickets_Queue{
private:
std::queue <ticket_element_> m_queue;
public:
void push(ticket_element_ ticket);
};
Tickets_Queue _queue;
};
class Ticket : public Request_manager::Ticket,
public std::enable_shared_from_this<Ticket>
{
public:
void start() {
cout << "Starting ticket" << endl;
}
};
void Request_manager::Tickets_Queue::push(ticket_element_ ticket_container){
ticket_container.ticket->start();
}
int main() {
Request_manager rm;
rm._queue.push ({0, make_shared<Ticket>()});
return 0;
}
manuel@desktop:~/projects$ g++ -Wall -Wextra -g main.cc -o main --std=gnu++2a -Wpedantic && time ./main
Starting ticket