エラー、バグ、質問 - ページ 1677

 
Sergei Vladimirov:
始値、終値については何も書いていない。
では、私が誤解していたようですね......すみません。
 

プライベートメソッドでエラーになるのはなぜですか?

class CFoo
  {
   private:
   void virtual func(int x) final { }
  };
 
class CBar : public CFoo
  {
   void func(int) { }
  };
 
fxsaber:

プライベートメソッドでエラーが発生するのはなぜですか?

Privateは関係ありません。あなたの関数はfinalとして宣言されており、あなたはそれをオーバーライドしようとしているのです。

ZS.コンパイルしてみました - コンパイラが問題点を言っています。

 
Sergei Vladimirov:
Privateは関係ありません、この関数をfinalと宣言します。
そのため、継承したクラスには親のプライベートメソッドは存在しません。だからこそ、オーバーライドはあってはならないのです。
 
fxsaber:
そのため、継承されたクラスには親のprivate-methodは存在しない。だからこそ、オーバーライドはあってはならないのです。
さて、こんにちは。
 
Sergei Vladimirov:
こんにちは。
公的な相続コンパイラによると、子孫からは親のprivate-methodsは利用できないそうです。
 
fxsaber:
公的な相続コンパイラによると、親のプライベートメソッドは、子孫からは利用できないそうです。

基底クラスのプライベート仮想メソッドは、継承元から呼び出すことはできませんが、オーバーライドすることは可能であり、それを行おうとしているのです。

 
Sergei Vladimirov:

基底クラスの閉じた仮想メソッドは、継承元から呼び出すことはできませんが、オーバーライドすることは可能です。

ありがとうございます、知りませんでした。何かと便利なのですが、思いつきません。X_Macroと 非常によく似ています。理解を深めるために、同じような例をまとめてみることにします。
 
fxsaber:
似たような例を作って理解を深めようと思います。

それはいい感じですね。

class BASE
{
private:
  void virtual Func() { Print(__FUNCSIG__); }
public:
  void Init() {Func();}
};

class CHILD : public BASE
{
private:
  virtual void Func() { Print(__FUNCSIG__); }
};

void OnStart()
{
  BASE* Base = new CHILD;
  
  Base.Init();
  
  delete(Base);
}

そんな構造が、どこかで役に立つのでしょうね。

 
fxsaber:
を公開継承しています。コンパイラによると、親のprivate-methodsは子孫から利用できないそうです。
これは、finalキーワードの類似品として、さらなる継承を明示的に禁止するために使用することができます。