【问题标题】:C++ Automatically call check methods from parent abstract class in implemented pure virtual methods?C ++在实现的纯虚拟方法中自动从父抽象类调用检查方法?
【发布时间】:2016-12-16 12:23:11
【问题描述】:

我在 C++ 中有这个抽象类:

class A {
public:
  A(int size);
  virtual void doSomething(int inputSize) = 0;
protected:
  virtual bool checkSize(int inputSize);
private:
  int size;
}

A::A(int size) : size(size){}
bool A::checkSize(int inputSize) { return size == inputSize; }

现在,我要保证的是,对于从A 派生的每个类B doSomething 的开头是这样的:

class B : public A{
  void doSomething(int inputSize);
}

void B::doSomething(int inputSize){
  if(!checkSize(inputSize)){
     std::cerr<<"wrong inputSize!"<<std::endl;
     return;
  }
  //do something...
}

如何保证A 的每个派生类都以这种方式实现doSomething

【问题讨论】:

标签: c++ abstract-class virtual pure-virtual


【解决方案1】:

您将doSomething 拆分为两部分:

class A {
public:
  void doSomething(int inputSize) {
    if (!checkSize(inputSize)){
       std::cerr << "wrong inputSize!" << std::endl;
       return;
    }
    doSomething_(inputSize);
  }
protected:
  virtual void doSomething_(int) = 0;
};

而在B 中,您只实现doSomething_

【讨论】:

    【解决方案2】:

    您可以直接签入A,例如:

    class A {
    public:
        A(int size);
        virtual ~A() = default;
    
        void doSomething(int inputSize)
        {
            if (!checkSize(inputSize)){
               std::cerr<<"wrong inputSize!"<<std::endl;
               return;
            }
            doSomethingWithChekedSize(inputSize);
        }
    
    protected:
        virtual void doSomethingWithChekedSize(int inputSize) = 0;
        virtual bool checkSize(int inputSize);
    private:
        int size;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 2018-06-02
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      相关资源
      最近更新 更多