明示的リロードダミー関数(C++11特性)


GCC4.7.0はすでにC++11標準の大部分の機能を支持して、今日C++11の明示的な重荷重の虚関数のメカニズムを試みて、感じはやはりとても柔軟で、文法の構造は以下の通りです:
#include <iostream>


class A
{
	public:
		virtual void fun1()
		{
			std::cout << "A:1" << std::endl;
		};
		virtual void fun2()final
		{
			std::cout << "A:2" << std::endl;
		}
		virtual void fun3()
		{
			std::cout << "A:3" << std::endl;
		}
		void fun4()
		{
			std::cout << "A:4" << std::endl;
		}
		virtual void fun5()
		{
			std::cout << "A:5" << std::endl;
		}
};


class B final: public A
{
	public:
		virtual void fun1()override//(1)
		{
			std::cout << "B:1" << std::endl;
		}
		/*virtual void fun2()override//(2)
		{
			std::cout << "B:2" << std::endl;
		}*/
		/*virtual void fun2()(3)
		{
			std::cout << "B:2" << std::endl;
		}*/
		/*void fun2()(4)
		{
			std::cout << "B:2" << std::endl;
		}*/
		virtual void fun3()//(5)
		{
			std::cout << "B:3" << std::endl;
		}
		/*virtual void fun4()override//(6)
		{
			std::cout << "B:4" << std::endl;
		}*/
		virtual void fun4()//(7)
		{
			std::cout << "B:4" << std::endl;
		}
		void fun5()override//(8)
		{
			std::cout << "B:5" << std::endl;
		}
};


int main()
{
	std::cout << "A" << std::endl;
	A a;
	a.fun1();
	a.fun2();
	a.fun3();
	a.fun4();
	a.fun5();


	std::cout << "B" << std::endl;
	B b;
	b.fun1();
	b.fun2();
	b.fun3();
	b.fun4();
	b.fun5();


	std::cout << "A*" << std::endl;
	A* p = new B();
	p->fun1();
	p->fun2();
	p->fun3();
	p->fun4();
	p->fun5();
}

以上は私が自分で作成した分析例です.以下、各部分を分析します.
(1)明示的なリロードベースクラス虚関数fun 1
(2)finalのベースクラス虚関数を明示的に再ロードし,コンパイルエラーを行う.final構文は、派生クラスが虚関数を再ロードすることを禁止します.
(3)暗黙的にベースクラスfinal虚関数を再ロードし,コンパイルエラーを行う.
(4)virtualを宣言せず、ベースクラスfinal虚関数を暗黙的に再ロードし、コンパイルエラー.
(5)暗黙的にベースクラスの虚関数を再ロードし、(1)と比較して欠陥がある:ベースクラスにこの虚関数が存在しない場合、コンパイル中にエラーを検出できない
(6)明示的にベースクラスの一般メンバー関数を再ロードし,overrideは虚関数のみを再ロードできるためコンパイルエラーである.
(7)fun 4関数を虚関数として再宣言し,リロードではなくベースクラスのfun 4を上書きする.
(8)virtualを明確に宣言することなく、ベースクラス虚関数fun 5を明示的に再ロードする.
以上より、
(1)派生クラスにおけるリロードベースクラス虚関数はoverrideを明示的に使用すべきであり,リロードベースクラスに存在しない虚関数を回避し,コンパイル期間中にエラーをチェックする.
(2)基底クラスの虚関数メソッドを終了したい場合,Bのクラスで再ロードされない場合はfinal修飾を明確に追加する必要がある.
(3)1つのクラスのメンバ関数が虚関数として宣言されると,リロードされるか,リロードが禁止され,いつまでも上書きできない.