0

1つの割り込みベクトルで多数のオブジェクトを直列に処理するSharedInterruptクラス(B)を作成したいと思います。ただし、SharedInterruptクラス(B)の派生クラス(C ..)は、SingleInterruptクラス(A)と同じISR()関数(func)を持っている必要があります。出来ますか?

class A {
public:
virtual void func() = 0;
};

class B : public A {
private:
void func() // I want to hide this method from derived classes (C, etc.)
{
// some code
}

public:
virtual void func() = 0; // And I want to keep A's interface, but compiler error!

};

class C : public B {
public:
void func() {
// some other code
}

};

PSこれで、非表示にするアイデアが1つだけあり、Bから中間サブクラスを作成してA :: func()を非表示にし、そこからCを継承します。

4

2 に答える 2

1

C++ でこれを正しく行う唯一の方法は、継承ではなく合成です。

IStreamこのパターンは、インターフェイスを定義する抽象基本クラス ( ) を使用します。この問題の一般的な例は、ソケット クラスと後で SSL ラッパーの両方に "OnRead" コールバックを実装しようとするときです。

実装は次のようになります - このアプローチの追加の利点は、オプションの可能性があるチェーンの部分を交換できることです (したがって、提示されている通信クラスの場合、オプションの圧縮または暗号化をプラグインできます)。モジュール)。

struct IStream {
  virtual OnRead()=0;
};

class Socket : IStream {
  IStream* _delegate;
protected:
  virtual OnRead(){
    while(ReadBytes())
      _delegate->OnRead();
  }
public:
  Socket(IStream* delegate):_delegate(delegate){}
};

class SSLSocket : IStream {
  Socket* _socket;
  IStream* _delegate;
protected:
  virtual OnRead(){
    while(ReadSslRecord())
      _delegate->OnRead();
  }
 public:
  SslSocket(IStream* delegate):_delegate(delegate),_socket(new Socket(this)){}
};

class AppSocket : IStream {
  IStream* _socket;
public:
  AppSocket(bool useSsl){
    _socket = useSsl?new SslSocket(this):new Socket(this);
  }
}
于 2012-08-10T09:20:24.730 に答える
0

継承アクセス指定子を使用して何かを試すことができます。操作方法がわからない場合は、次を参照してください。

http://flylib.com/books/2/253/1/html/2/images/12fig27.jpg

于 2012-08-13T05:12:41.617 に答える