在每个孩子的特定函数调用上调用父函数C ++

时间:2017-11-22 14:40:08

标签: c++ polymorphism

因此假设有一个带有函数foo的A类 A类是几个具有函数foo的类的父类 所有子类都需要其功能     A::foo并加上它 例如:

    class A
    {
    public:
      void foo()
      {
         print('A');
      }
    };

    class B:public A
    {
    public: 
       void foo()
       {
          print("B");
       }
    };
    class C:public A
    {
    public:
      void foo()
        {
           print("C");
        }
    };
    void main()
    {
       B b;
       C c;
       c.foo()// now only goes to C::foo(), meaning print C. I want it to to also go into A::foo() meaning print AC
       b.foo()//now only goes to B::foo(),meaning print B. want it to print AB
    }

如果我想添加class D : A foo函数,它还会A::foo()然后D::foo()

对不起,如果我遗漏了一些明显的东西。

编辑:因为不清楚问题是,是否有自动方式这样做。

编辑:找到了解决方法:

    class A
    {
    virtual void foo2(){}
    public:
      void foo()
      {
         print('A');
         foo2();
      }

    };

    class B:public A
    {
       void foo2()
       {
          print("B");
       }
    public: 
    };
    class C:public A
    {
              void foo2()
        {
           print("C");
        }
        public:
    };
    void main()
    {
       B b;
       C c;
       c.foo()// now prints AC
       b.foo()//now prints AB
    }

似乎是多余的,因为现在有2个函数。

2 个答案:

答案 0 :(得分:3)

您可以使用A::foo()调用父类的函数实现。 在您的情况下,只需添加该函数调用即可获得您想要的结果:

class B:public A
{
public: 
   void foo()
   {
      A::foo();
      print("B");
   }
};

作为旁注,每当您打算覆盖函数时,都应将其声明为virtual

 class A
{
public:
  virtual void foo()
  {
     print('A');
  }
};

然后在覆盖它时,请使用override关键字:

class B:public A
{
public: 
   void foo() override
   {
      print("B");
   }
};

答案 1 :(得分:0)

你所谓的解决方法是这个问题的既定解决方案,虽然有些人可能会称之为解决方法但很多人不会。

它甚至有一个涵盖它的名字。非虚拟接口模式。

草药口香糖: - http://www.gotw.ca/publications/mill18.htm

S.O.的一个例子,可能还有更多: - Non-virtual interface design pattern in C#/C++

我认为这是一种自动完成的方法。

至于你的冗余,因为它有2个功能 - 以前有2个(基本版本和派生版本)。

这种方法在某些设计中的一个好处是,如果虚拟方法foo2是纯虚拟的(这会使A成为抽象),那么这会强制所有直接派生类实现foo2。 (我说立即因为如果B派生自A它必须实现foo2但是如果C然后从B C派生而不是强制实现foo2,则它可以访问B :: foo2)