"super"关键字的 C++ 模拟
c++ emulation of the "super" keyword
在 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;
//...
}
那么你只有一行需要更改。
相关文章:
- 如何使用Google Mock来模拟gettimeofday()
- G锁定铸造到基础上会释放模拟行为
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 落砂模拟碰撞检测C++和SFML
- 在gtest.中使用fff.h模拟系统API
- 谷歌模拟和覆盖关键字
- 用C#中的并集模拟C++嵌套结构
- 在同一模拟中使用静脉和静脉_ inet内容时出现运行时错误
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 我写了一个C++程序来模拟Enigma机器.我没有得到输出
- 如何模拟不同边数的骰子滚动?
- 模拟持久按键
- 使用SIR模型的疾病爆发模拟
- 在 c++ 中模拟输入并在 JAVA 中读取它?
- 转发变量参数列表以模拟 std::thread
- 如何在谷歌模拟中匹配 C 样式数组
- 如何使用兰德随机化模拟点击
- 模拟GPS数据,以便使用Qt与Traccar一起使用
- QKeyPress - 在Qt中模拟按键
- 如何使用不同的谷歌模拟运行相同的谷歌测试用例?