【问题标题】:Is it possible to override the virtual function of a specific parent?是否可以覆盖特定父级的虚拟功能?
【发布时间】:2015-10-30 03:44:43
【问题描述】:

假设您有以下类层次结构:

class A
{
   public:
   virtual void foo() {}
}

class B
{
   public:
   virtual void foo() {}
}

class C: public A, public B
{
    public:
    virtual void foo() override {  } // This overrides both
}

class D: public A, public B
{
    public:
    // Is there syntax so that there is a separate override for each?
    // Maybe something like:
    // virtual void A::foo() override {}
    // virtual void B::foo() override {}
}

有没有办法在类 D 上有两个 foo 函数,这样如果 D 作为对 A 的引用传递,则调用 D 中的一个函数,如果 D 作为对 B 的引用传递,则调用另一个函数在 D 中被调用?

如果您从两个外部库继承,并且它们恰好具有重叠的函数说明符,则用例会是这样?

【问题讨论】:

标签: c++ multiple-inheritance overriding virtual-functions


【解决方案1】:

您不能完全做到这一点,但 Stroustrup 本人展示了一种解决方法。

class A_foo_renamer : public A
{
    virtual void A_foo () = 0;
    virtual void foo() override { A_foo(); }
};

class B_foo_renamer : public B
{
    virtual void B_foo () = 0;
    virtual void foo() override { B_foo(); }
};

class D: public A_foo_renamer, public B_foo_renamer
{
   virtual void A_foo() override {}
   virtual void B_foo() override {}
   // leave A::foo and B::foo alone
};

【讨论】:

  • 这种方法是否有任何实现开销?
  • 大多数编译器会将 A_foo_renamer 编译为单个间接跳转(x64 上的 2-3 条指令),尽管理论上可以只修改 vtable 以使 foo 和 A_too 条目指向相同的代码。我不知道是否有任何编译器这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
相关资源
最近更新 更多