【发布时间】:2019-10-17 12:28:19
【问题描述】:
直到 'super' 在 c++ 中实现,我一直在寻找一种方法来自己模拟它。 动机:这是一个典型的场景:
class A
{
void SomeMethod();
}
class B : public A
{
void SomeMethod() override;
}
void B::DoSomething()
{
A::SomeMethod();
}
一切都很好,直到有人在两者之间插入一个类:
class C : public A
{
void SomeMethod() override;
}
并更改继承:
class B : public C {...}
在大多数情况下,我希望直接调用基类,除非我明确地将所有 A:: 调用替换为 C:: 调用,否则不会发生这种情况。
“super”关键字在这里非常有用,它的意思是:“使用直接基数,但如果有歧义则发出编译器错误”。
阅读了一些建议,我试图定义如下:
class A
{
void SomeMethod();
protected:
using super = A;
}
class C
{
void SomeMethod();
protected:
using super = C;
}
void B::DoSomething()
{
super::SomeMethod();
}
但是调用了 A::SomeMethod() 而不是 C::SomeMethod()...
编译器如何处理多个同名别名?
我该如何解决这个问题?
编辑:建议的其他问题是一个旧问题,可以通过使用现代 c++ 改进解决方案。
【问题讨论】:
-
据我所知,
super由于多重继承,不会在 C++ 中实现。 -
你的目标是什么编译器/平台?
-
Windows 和 Mac。
-
@gil_mo 真可惜 - 在 windows/msvc 上有一个编译器扩展
__super -
Using "super" in C++的可能重复
标签: c++ inheritance keyword