クリーンC ++:民営オーバーライド仮想関数

C++11に追加overrideキーワードサブクラスがオーバーライド基本クラスの仮想関数を必要とするとき、明示的に提供するためにoverride、コンパイラが効果的に安全性を向上させることができます。

コンパイル時の安全性

例えば、基底クラスの存在がTest宣言している2抽象メソッドを。

struct TestResult;

struct Test {
  virtual void run(TestResult&) = 0;
  virtual int countTestCases() const = 0;

  virtual ~Test() {}
};

明示的に示され、サブクラスで抽象基底クラスのメソッドのオーバーライドoverride可読性を向上させるだけでなく、コンパイル時に安全性を高めるだけではなく。あなたが厳密にルールに従った場合とき再構成法の署名抽象基底クラス、コンパイラはすべての保護効果の優れた再構成を提供する、正確にコンパイルに失敗ための基準点を見つけることができます。

#include "cut/core/test.h"

struct TestDecorator : Test { 
  TestDecorator(Test& test);

private: 
  void run(TestResult&) override;
  int countTestCases() const override;

private:
  Test& test; 
};

プレス・プログラミング・インタフェース

「プログラミング・インターフェースを押して」重要なオブジェクト指向の原則です。この原則に続き、二つの方向の変化が独立したままにするように、デカップリングモジュール間で行うことができます。C ++言語、およびアクセス制御では、多型の挙動が隔離されているオーバーライドするサブクラスは親のプライベート仮想関数をオーバーライドすることができます。例えば、テンプレートの方法の典型的な実施態様では、プライベートオーバーライド基底クラス、仮想関数が実装されています。

民営オーバーライド仮想関数は、効果的にユーザーが誤ってサブクラスのメンバーを呼び出すことを確認し、明確にユーザプログラムを抽象インタフェースのタイプに基づいて実施されるべきで伝えることができます。例えば、実施形態では、TestDecoratorコンストラクタはパブリックである必要があり、またはそのタイプのインスタンスが構築されないであろう。すべての仮想関数が宣言されて上書きされprivate、ユーザーの警告に基づくべきでTest、実行時には、ポリモーフィック対応する抽象メソッドを呼び出します。

テストスイート:テストは、倉庫の実現の例を設定します

ではTestSuite、例えば、それは、一連の開催Testもあり、その実行時の型のタイプの例をTestCase, TestSuite, TestDecoratorより多くを。抽象に基づくTest実施形態の暗黙のセットを達成するためのツリー構造で、タイプ。

#include "cut/core/test.h"
#include "cut/core/internal/bare_test_suite.h"
#include <vector>

struct TestSuite : Test, private BareTestSuite {
  ~TestSuite();

  void add(Test* test);

private:
  void run(TestResult& result) override;
  int countTestCases() const override;

private:
  const Test& get() const override;
  void runBare(TestResult& result) override;

private:
  std::vector<Test*> tests;
};

TestSuiteデストラクタ、および他の機能を実装する場合、それが基づいているTest呼び出されたときマルチステート動作の抽象型。

#include "cut/core/test_suite.h"
#include "cub/base/algo.h"

void TestSuite::add(Test* test) {
  tests.push_back(test);
}

TestSuite::~TestSuite() {
  for (auto test : tests) {
    delete test;
  }
}

int TestSuite::countTestCases() const {
  static auto accumulator = [](Test* test){
    return test->countTestCases();
  };
  return cub::reduce(tests, 0, accumulator);
}

const Test& TestSuite::get() const {
  return *this;
}

void TestSuite::runBare(TestResult& result) {
  for (auto test : tests) {
    test->run(result);
  }
}

void TestSuite::run(TestResult& result) {
  result.runTestSuite(*this);
}

Test, TestSuite, TestCase, TestDecorator以下に示すように関係。

2254249-c1d6e92c2f475d00.jpg
暗黙の木:修正と組み合わせて、

おすすめ

転載: blog.csdn.net/weixin_34417183/article/details/90959638