0

仮想基本関数をオーバーライドする場合、派生クラス メンバー関数宣言で virtual キーワードを再利用する必要がないことはわかっていますが、それが仮想であることを明確にするためにそうするのは良い習慣ですか? また、宣言および/または定義における const キーワードの存在はどうですか? Alexandrescu がこれについて何か言及していると思いますが、それが何であったか思い出せませんか?

4

1 に答える 1

6

あなたの質問は非常に混乱しているようです。virtual基本クラスのメソッドをオーバーライドする場合はオプションです。必要な場合はオプションconstではありません。これはあなたが思っていることをしません:

struct A
{
  virtual void Func() const;
};

struct B : public A
{
  virtual void Func();
};

構造体Bには、という名前の2つの関数がありFuncます。1つは、呼び出されたオブジェクトがであるときに呼び出され、もう1つは、呼び出されconstていないときに呼び出されconstます。このコードの内容は上書きされていません。これらは2つの別個の仮想関数です。

を無視してconst、すべてが正常に機能することを期待することはできません。

virtual実際、この例は、派生クラスでオーバーライドするときに使用する必要がある理由も示しています。この場合、基本クラスの関数をオーバーライドしようとしたことは明らかですが、関数のシグネチャが間違っています。virtualそこがなければ、何かを無効にするつもりだったという即時の兆候はありません。

それは大きな助けではありませんが、それは何かです。

overrideC ++ 11は、疑似キーワードを使用して(実際に問題を解決するという点で)より優れたソリューションを提供します。

struct A
{
  virtual void Func() const;
};

struct B : public A
{
  virtual void Func() override; //Gives a compiler error, since it is not overriding a base class function.
};
于 2012-06-17T02:01:53.857 に答える