1. ホーム
  2. c++

[解決済み] なぜ virtual と static キーワードはクラス宣言の外では許されないのですか?

2022-02-02 14:03:24

質問

C++ではなぜfollowが許されないのか知りたいのですが?

1番目のプログラム

#include <iostream>
class Test {
    public:
        int myfun();
}
virtual int Test::myfun()
{ return 0; }
int main()
{ }

[Error] 'virtual' outside class declaration

2番目のプログラム

#include <iostream>
class Test {
    public:
        int myfun();
};
static int myfun() {
    std::cout<<"This program contains an error\n";
    return 0; 
}
int main() {
  Test::myfun(); 
  return 0; 
}

[エラー] メンバ関数 'int Test::myfun()' をオブジェクトなしで呼び出すことはできません。

そこで質問なのですが

なぜ、1番目のプログラムのようにメンバー関数をvirtualにできないのでしょうか?

なぜ、2番目のプログラムのようにstaticなメンバ関数を作れないのですか?

この2つのキーワードをクラス外に出してはいけない理由はあるのでしょうか?

どのように解決するのですか?

修飾子は関数宣言の上になければなりません。そうでなければ、宣言だけで関数を呼び出すことは不可能です。

宣言の上に置かなければならないのだから、定義の上にも置くのは冗長である。宣言と一致する限り)禁止する特別な理由はありませんが、許可する特別な理由もありません。