gpt4 book ai didi

c++ - 将派生虚拟覆盖转换为基础纯虚拟成员

转载 作者:行者123 更新时间:2023-11-28 02:03:04 25 4
gpt4 key购买 nike

我理解为什么您不能像解释的那样简单地将派生类成员函数指针转换为基类成员函数指针 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 的错误 与类型转换无关)。

最佳答案

无需操作&derived::foo 的类型。可以只使用 &base::foo 代替。

指向成员函数的指针尊重虚拟性。这个电话

base* pBase = new derived;
auto pFoo = &base::foo;
(pBase->*pFoo)();

实际上会调用 derived::foo,就像简单调用 pBase->foo() 一样。

关于c++ - 将派生虚拟覆盖转换为基础纯虚拟成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38637785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com