"C3248: '<クラス名>::<メンバ名>': 'final' として宣言されている関数は、'<クラス名>::<メンバ名>' によってオーバーライドされることはできません" に関する原因と対処

このコンパイルエラーの原因と対処に関して説明します。

スポンサード リンク

Microsoft Visual C++にて以下のソースでコンパイルエラーが発生します:

コンパイルエラーメッセージ:
error C3248: '<クラス名>::<メンバ名>': 'final' として宣言されている関数は、'<クラス名>::<メンバ名>' によってオーバーライドされることはできません<ソースファイル>: note: '<クラス名>::<メンバ名>' の宣言を確認してください

ソース(バグ有り):

#include <iostream>
#include <string>
using namespace std;
class CVehicle{
public:
virtual void move() final
{
cout << "a Vehicle runs." << endl;
} }; class CCar : public CVehicle {
public:
void move()
{
cout << "a car runs." << endl;
} }; int main() {
CCar mycar;
mycar.move();
return 0; }


原因:
final により派生クラスでのオーバライド(上書き)が禁止されているクラスを上書きしようとしました。

対処:
関数の仕様を確認します。オーバライドが禁止されているのには理由があるはずなので、その理由を確認します。

それでもオバーライドしたい場合は、親クラスで定義されている final を取り消します。


ソース(修正済み):

#include <iostream>
#include <string>
using namespace std;
class CVehicle{
public:
virtual void move()
{
cout << "a Vehicle runs." << endl;
} }; class CCar : public CVehicle {
public:
void move()
{
cout << "a car runs." << endl;
} }; int main() {
CCar mycar;
mycar.move();
return 0; }

スポンサード リンク



[コンパイルエラーコード、メッセージに戻る]