2

簡単に言えば、タイトルが示すように、親から子の静的メソッドを呼び出す必要があります。問題は、複数の子が存在する可能性があるため、親の子クラス名がわからないことです。静的メソッドは静的である必要があります。例えば:

class A{ // parent class
public:
 void process(){
  getData(); //  <-- Problem
 }
}

class B: public A{ // child class
 static int getData();
}

void main(){
 B b;
 b.process();
}

頭に浮かぶ解決策の 1 つは、静的メソッドを呼び出す仮想メソッドを用意することです。これはあまり良いことではなく、私が持っているすべての子に対してメソッドを実装する必要があることを意味します:

class A{ // parent class
 virtual int getDataFromStaticMethod() = 0;
public:
 void process(){
  getData(); //  <-- Problem
 }
}

class B: public A{ // child class
 static int getData();
 virtual int getDataFromStaticMethod(){
  return B::getData();
 }
}

void main(){
 B b;
 b.process();
}

しかし、静的メソッドを使用して純粋仮想メソッドを実装できることを本当に望んでいます。

class A{ // parent class
 virtual int getData() = 0;
public:
 void process(){
  getData(); //  <-- Problem
 }
}

class B: public A{ // child class
 static int getData();
}

void main(){
 B b;
 b.process();
}

助言がありますか?

ありがとう!

4

3 に答える 3

3

テンプレートを使用できます。

template<typename TChild>
class A
{
   typedef TChild child_type;

public:
   void process()
   {
      child_type::getData();
   }
};

class B: public A<B>
{
   static int getData();
};

class C: public A<C>
{
   static int getData();
};

int main(int argc, char** argv)
{
   B b;
   b.process();

   C c;
   c.process();
}

ノート:

基本クラスで静的状態を保持する場合、または基本クラス オブジェクトのコレクションを保持する必要がある場合は、追加のレイヤーが必要になります。

class ABase
{
   //any static state goes here
public:
   virtual int process() = 0;
};

template<typename TChild>
class A: public ABase
{
   typedef TChild child_type;

public:
   int process()
   {
      child_type::getData();
   }
};


class B: public A<B>
{};


std::vector<ABase*> a_list;
于 2013-08-11T22:27:27.317 に答える