0

プライベート仮想関数を使用する理由はわかっていますが、どのように正確に実装できますか?

例えば:

class Base{
[...]
private:
 virtual void func() = 0;
[...]
};

class Derived1: public Base{
  void func() 
  { //short implementation is ok here
  }
};

class Derived2: public Base{
  void func(); //long implementation elsewhere (in cpp file)
};

[...] 

void Derived2::func()
{ //long implementation 
}

最初のバージョンは問題ありませんが、常に可能であるとは限りません。2番目のバージョンは単に名前を隠すのではありませんか?のクラス宣言内でそれを行うことができない場合、Base::func()のをどのように定義しますか?Derived2Dereived2

ありがとう

4

3 に答える 3

4

のクラス宣言内でそれを行うことができない場合、Base::func()のをどのように定義しますか?Derived2Dereived2

Base::func()「」の「」を定義するのではなくDerived2(これが何であれ)、を定義しますDerived2::func()。これは私にとってはうまくコンパイルされます:

#include <iostream>

class Base{
private:
 virtual void foo() = 0;
public:
  void bar() {foo();}
};

class Derived: public Base{
  void foo();
};

void Derived::foo()
{
   std::cout << "inside of 'Derived1::foo()'\n";
}

int main()
{
  Derived d;
  Base& b = d;
  b.bar();
  return 0;
}

それであなたの問題は何ですか?

于 2010-03-16T15:10:18.513 に答える
3

ポリモーフィズムとアクセシビリティは、2つの別個の概念です。基本クラスのプライベート仮想関数はいつでもオーバーライドできますが、基本クラス自体以外の場所から基本クラスバージョンを呼び出すことはできません。また、C ++ FAQ Liteには、このテーマに関するかなり長いエントリがあります。

于 2010-03-16T14:57:42.717 に答える
-2

私がここで理解していることについては、あなたはポリモーフィズムを行おうとしています。

ポリモーフィズムを実現するために従わなければならない4つのルールがあります。

  1. 基本クラスから継承する必要があります。
  2. 関数は、すべてのクラスで同じ名前を持っている必要があります。
  3. すべての関数の前にvirtualキーワードが必要であり、子の関数の最後にoverrideキーワードが必要です。
  4. メインクラスでポインタを使用し、「new」キーワードを使用してそれを子型として定義する必要があります。

コード例については、この素晴らしいwikiページを参照してください。

これがあなたが望んでいたものであることを願っています。^^

敬具、

SeargX

于 2010-03-16T15:12:44.817 に答える