0

我想创建一个 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 现在我只有一个想法要隐藏,从 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 回答