我明白你为什么不能简单地将派生类成员函数指针转到基类成员函数指针,如解释here。演员派生虚拟覆盖基地纯虚拟成员
但是,鉴于这个片段:
struct base
{
virtual void foo() = 0;
};
struct derived : base
{
void foo() override {};
};
struct invoker
{
typedef void(base::*target)();
invoker(base* b, target t)
{
(b->*t)();
}
};
template<typename B, typename D>
void (B::*cast(void (D::*method)()))()
{
return static_cast<void(B::*)()>(method);
}
derived d;
invoker bad(&d, &derived::foo); //C2664
invoker good(&d, cast<base>(&derived::foo));
我想问问有没有可能使编译器理解它来装饰基函数签名是一个纯虚方法,它会某处跨层次结构来实现(否则我不能构造一个B
类型的对象)?我明白为什么我不能用普通函数做到这一点,但恕我直言,在纯虚函数的情况下,编译器有保证它会被执行(如果没有完成,我会得到关于类B
的错误,而不是关于投)。
目前还不清楚你要求什么样的装饰。如果你是C++设计委员会的最高领导,你会怎么做?不要担心一致性或正确性,只需显示您想要添加到C++中的内容即可。如果你只是想告诉编译器在'base'中存在'derived :: foo',你可以直接写'&base :: foo'。 –
@ n.m。我想避免做出明确的演员:D但它更像是“我有没有意识到某种方式”的问题类型。 –
不,不要演员。只需从&base :: foo开始。 '&derived :: foo'做什么'&base :: foo'不能做什么? –