で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
以下に示すように関係。