【问题标题】:Overloading virtual functions of the same name from different base classes. Is it possible? [duplicate]从不同的基类重载同名的虚函数。可能吗? [复制]
【发布时间】:2011-11-11 06:43:47
【问题描述】:

标题可能令人困惑。

假设我们有以下设置;

class A
{
public:
    virtual void fn() = 0;
};

class B
{
public:
    virtual int fn() {};
};

class C: public A, public B
{
};

有没有办法在class C中定义A::fn

【问题讨论】:

    标签: c++ inheritance virtual-functions overriding


    【解决方案1】:

    C 中无法指定 C::fn() 之一 实现重载A::fn()(可能还有另一个重载 B::fn())。但是,您可以做的是引入中间体 “重命名”函数的类,例如:

    class RemapA : public A
    {
        virtual void fnInA() = 0;
    public:
        virtual void fn()
        {
            fnInA();
        }
    };
    
    class RemapB : public B
    {
        virtual int fnInB() = 0;
    public:
        virtual int fn()
        {
            return fnInB();
        }
    };
    
    class C : public RemapA, public RemapB
    {
        virtual void fnInA() { /* ... */ }
        virtual void fnInB() { /* ... */ }
        //  ...
    };
    

    【讨论】:

      【解决方案2】:

      。这不可能。它总是会与fn() 中的任何一个发生冲突。

      fn()的语法不同,

      void fn();  // in A
      

      B 中,

      int fn();  // in B
      

      您必须使AB 中的这些语法相同,才能让C 实现fn()Demo.

      【讨论】:

        【解决方案3】:

        您可能想阅读我对以下问题的回答:Implement two functions with the same name but different, non-covariant return types due to multiple abstract base classes 简而言之:是的,调用它有一些限制。它可以称为 A(指针或引用)或 B(指针或引用),但不能称为 C,因为那样会模棱两可。

        【讨论】:

          猜你喜欢
          • 2011-04-12
          • 2013-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-26
          • 1970-01-01
          • 2020-12-23
          • 2017-05-24
          相关资源
          最近更新 更多