c++ - 一个类中可以有多个 operator& 吗?
问题描述
我试图表达一个接口,其中两个接口组合相同的东西,并由实现继承(单一继承)。这个想法是从接口类本身继承的组合。它是这样的:
class A_interface;
class B_interface {
public:
B_interface(const B_interface& a) = delete;
B_interface& operator=(const B_interface& a) = delete;
virtual operator A_interface&() = 0;
protected:
B_interface() = default;
};
class A_interface {
public:
A_interface(const A_interface& a) = delete;
A_interface& operator=(const A_interface& a) = delete;
virtual operator B_interface&() = 0;
void afunc()
{
printf("Hello from base A\n");
}
protected:
A_interface() = default;
};
class B_Impl;
class A_Impl: public A_interface {
public:
operator B_Impl&();
virtual operator B_interface&() override;
protected:
friend B_Impl;
A_Impl() = default;
};
class B_Impl:public B_interface {
public:
B_Impl()=default;
operator A_Impl&();
virtual operator A_interface&() override;
private:
A_Impl a;
};
A_Impl::operator B_Impl&()
{
printf("Hello from A_Impl::operator B_Impl&\n");
return *(B_Impl*)(((uint8_t*)this)-offsetof(B_Impl, B_Impl::a));
}
A_Impl::operator B_interface&()
{
printf("Hello from A_Impl::operator B_interface&\n");
return A_Impl::operator B_Impl&();
}
B_Impl::operator A_Impl&()
{
printf("Hello from B_Impl::operator A_Impl&\n");
return a;
}
B_Impl::operator A_interface&()
{
printf("Hello from B_Impl::operator A_interface&\n");
return B_Impl::operator A_Impl & ();
}
现在从外部代码:
B_Impl b;
b.operator A_interface &().operator B_interface &().operator A_interface &().afunc();
A_interface& a1 = b;
输出是:
Hello from B_Impl::operator A_interface&
Hello from B_Impl::operator A_Impl&
Hello from A_Impl::operator B_interface&
Hello from A_Impl::operator B_Impl&
Hello from B_Impl::operator A_interface&
Hello from B_Impl::operator A_Impl&
Hello from base A
Hello from B_Impl::operator A_interface&
Hello from B_Impl::operator A_Impl&
现在的问题是:我需要重载什么才能使以下代码正常工作?
A_interface* a2 = &b;
解决方案
文字重载需要一个参数来重载,但这是一元 operator&
的。您似乎想重载返回类型,而不是参数。
为此,您需要返回一个代理类型,它对A_interface*
和都有隐式转换B_interface*
。这些必须是代理的成员,因为您显然不能将构造函数添加到A_interface*
. 指针是内置类型,没有任何成员函数,更不用说用户定义的成员类型了。
推荐阅读
- laravel - 无法安装 laravel/socialite 包
- angular - 角度 - 在搜索中粘贴 ng 选择不起作用
- python - Python Plotly Sankey Diagram:如何根据“源”和“目标”计算“值”,因此所有行与节点的高度相同
- google-cloud-platform - 是否有列出所有谷歌计算区域的 API
- sql - Web App查询慢,命令行查询快
- html - 响应元素上的背景图像和径向渐变?
- java - 为什么它显示只有创建视图层次结构的原始线程才能触摸它的视图
- laravel - pwa Laravel 在控制台中没有给我错误,但在缓存中的服务工作者中没有错误
- php - php ajax依赖下拉列表不从表中加载数据
- javascript - 无需单击任何确定或取消图标即可打开 swal