"super"关键字的 C++ 模拟

c++ emulation of the "super" keyword

本文关键字:模拟 C++ 关键字 super      更新时间:2023-10-16

在 c++ 中实现 'super' 之前,我正在寻找一种自己模拟它的方法。 动机:这是一个典型场景:

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 ++进行改进。

解决此问题的一种方法是使其成为模板,但它确实限制了您使用类的方式。 这样,您可以将基类设置为模板类型,现在您有了可以引用它们的泛型名称。 那看起来像

struct A
{
void do_something() { std::cout << "A::do_somethingn"; }
};
template <typename Super>
struct B : Super
{
void do_something() 
{ 
std::cout << "B::do_somethingn"; 
Super::do_something(); 
}
};
template <typename Super>
struct C : Super
{
void do_something() 
{ 
std::cout << "C::do_somethingn"; 
Super::do_something(); 
}
};
int main() 
{
B<A> b;
b.do_something();
C<B<A>> c;
c.do_something();
}

哪些输出

B::do_something
A::do_something
C::do_something
B::do_something
A::do_something

您甚至可以使用多个继承并单独访问每个碱基,例如

template <typename Super1, typename Super2>
struct B : Super1, Super2
{
void do_something() 
{ 
std::cout << "B::do_somethingn"; 
Super1::do_something(); 
Super2::do_something(); 
}
};

这个要求没有意义:哪个基类应该被视为超类?

如果您的类具有单一继承,则可以通过添加using声明来减轻维护负担:

class B : public A
{
using Base = A;
//...
}

那么你只有一行需要更改。