【问题标题】:C++ avoiding manually calling base class functionC++避免手动调用基类函数
【发布时间】:2012-03-30 03:38:05
【问题描述】:

我有一组这样的类:

class A {
 public:
  int DoIt() {
     //common code
  }
};

class B : public A {
  int DoIt() {
    if (A::DoIt() == 1) {
      return 1;
    }
    else {
      // do b specific code
    }
  }
};

class C : public A {
  int DoIt() {
    if(A::DoIt()==1) {
      return 1;
    }
    else {
      // do c specific code
    }
  }
};

有什么方法可以避免手动输入此代码:

if (A::Doit() == 1) { return 1; } else {

在从 A 派生的每个类中?

【问题讨论】:

  • 正确的语法是class B : public A。 C++ 不是 Java。
  • @Justinᚅᚔᚈᚄᚒᚔ:OP 询问如何避免在每个子类中输入 if(A::Doit()==1) return 1; } else {,而不是如何在不知道 A 的情况下调用 A::Doit()。链接的问题甚至与继承无关。

标签: c++ design-patterns inheritance


【解决方案1】:

只需将特定代码分离到另一个方法虚拟方法中即可。

class A
{
public:
    int DoIt() /*final*/
    {
        // common code
        if (return_value == 1)
           return 1;
        else
           return DoIt_specific();
    }

private:
    virtual int DoIt_specific() = 0;
    // ^ or some "A"-specific actions if A cannot be abstract.
};

class B : public A
{
    virtual int DoIt_specific() /*override*/
    {
        // specific code for B
    }
};

这被称为non-virtual interface 成语。

【讨论】:

    猜你喜欢
    • 2021-04-02
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多