【发布时间】:2018-06-07 18:59:56
【问题描述】:
考虑以下 C++17 中的代码:
#include <iostream>
#include <functional>
struct base
{
base() {std::cout << "base::base" << std::endl;}
virtual ~base() {std::cout << "base::~base" << std::endl;}
virtual void operator()() {std::cout << "base::operator()" << std::endl;}
};
struct derived1: base
{
derived1() {std::cout << "derived1::derived1" << std::endl;}
virtual ~derived1() {std::cout << "derived1::~derived1" << std::endl;}
virtual void operator()() {std::cout << "derived1::operator()" << std::endl;}
};
struct derived2: base
{
derived2() {std::cout << "derived2::derived2" << std::endl;}
virtual ~derived2() {std::cout << "derived2::~derived2" << std::endl;}
virtual void operator()() {std::cout << "derived2::operator()" << std::endl;}
};
int main(int argc, char* argv[])
{
base* ptr1 = new derived1();
base* ptr2 = new derived2();
std::function f1(*ptr1);
std::function f2(*ptr2);
std::invoke(*ptr1); // calls derived1::operator()
std::invoke(*ptr2); // calls derived2::operator()
std::invoke(f1); // calls base::operator()
std::invoke(f2); // calls base::operator()
delete ptr1;
delete ptr2;
return 0;
}
std::function 似乎没有用虚函数做正确的事情。有什么方法可以使std::invoke(*ptrN) 和std::invoke(fN) 的行为方式相同吗?或者有什么方法可以创建一个新的函数包装器来处理虚函数?
【问题讨论】:
-
std::function复制它接收到的函子。你传给它base。 -
你也应该更喜欢
std::unique_ptr -
我不相信它是重复的。 “为什么”不是帖子的重点。重点是如何让它发挥作用。
-
你用什么编译的? (编译器/版本)
标签: c++ oop templates c++17 virtual-functions