直到“ 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 ++改进解决方案。
答案 0 :(得分:3)
一种解决方法,但确实限制了使用类的方式,那就是使其成为模板。这样,您可以将基类设置为模板类型,现在您可以使用通用名称来引用它们。看起来像
struct A
{
void do_something() { std::cout << "A::do_something\n"; }
};
template <typename Super>
struct B : Super
{
void do_something()
{
std::cout << "B::do_something\n";
Super::do_something();
}
};
template <typename Super>
struct C : Super
{
void do_something()
{
std::cout << "C::do_something\n";
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_something\n";
Super1::do_something();
Super2::do_something();
}
};
答案 1 :(得分:0)
该要求没有道理:哪个基类应被视为超类?
如果您的类具有单一继承,则可以通过添加import { createMuiTheme } from '@material-ui/core/styles';
import { ThemeProvider } from '@material-ui/styles';
const theme = createMuiTheme({
...
})
...
<ThemeProvider theme={theme}>
<MyChild />
</ThemeProvider>
...
声明来减轻维护负担:
using
那么您只需要更改一行即可。