【问题标题】:calling parent function on a specific function call of every child C++在每个子 C++ 的特定函数调用上调用父函数
【发布时间】:2017-11-22 14:40:07
【问题描述】:

因此假设存在具有函数 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
    }

如果我想用 foo 函数添加 class D : A,它也会先添加 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 个函数。

【问题讨论】:

  • {A::foo(); print("D");}主体实现D::foo()
  • 无法自动执行此操作,但每个foo 函数可以根据需要调用A::foo()
  • thx ,这就是我想确认的。

标签: c++ polymorphism


【解决方案1】:

您可以使用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");
   }
};

【讨论】:

  • 感谢您的回答!编辑:但你错过了我的意思。我必须在每个继承 A 的类中执行此操作。我的问题是有没有办法为所有派生类设置它。
  • 没有办法自动完成,你只需要对每个派生类都这样做
【解决方案2】:

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

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

草药萨特:- 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 )

【讨论】:

  • 唯一的问题是它的编译方式是否与虚函数的编译方式相同,这意味着仅在调用相关函数时编译相关函数,或者编译为函数中的函数
猜你喜欢
  • 2010-09-18
  • 2018-03-18
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多