对“ super”关键字的c ++仿真

时间:2019-10-17 12:28:19

标签: c++ inheritance keyword

直到“ 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 ++改进解决方案。

2 个答案:

答案 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

那么您只需要更改一行即可。