如何在C ++中隐藏虚方法并保持接口?

时间:2012-08-10 08:48:15

标签: c++ oop virtual

我想创建一个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
}

};

P.S。现在我只有一个隐藏的想法,从B创建中间子类来隐藏A :: func()并从中继承C.

2 个答案:

答案 0 :(得分: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);
  }
}

答案 1 :(得分:0)

您可以使用继承访问说明符尝试某些操作。如果您不知道它是如何工作的,请看看:

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