明示的リロードダミー関数(C++11特性)
GCC4.7.0はすでにC++11標準の大部分の機能を支持して、今日C++11の明示的な重荷重の虚関数のメカニズムを試みて、感じはやはりとても柔軟で、文法の構造は以下の通りです:
以上は私が自分で作成した分析例です.以下、各部分を分析します.
(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つのクラスのメンバ関数が虚関数として宣言されると,リロードされるか,リロードが禁止され,いつまでも上書きできない.
#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つのクラスのメンバ関数が虚関数として宣言されると,リロードされるか,リロードが禁止され,いつまでも上書きできない.