【问题标题】:How to hide virtual method in C++ and keep interface?如何在 C++ 中隐藏虚拟方法并保留接口?
【发布时间】:2012-08-10 08:48:14
【问题描述】:

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

};

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

【问题讨论】:

  • 我可能误解了你的问题,但是为什么B 的私有func 函数不能与从A 覆盖的函数有不同的名称?
  • 所有东西都应该命名相同吗?您想要达到的目标令人困惑。
  • 内部A的机制调用func()。必须调用 B 的函数。而 B 的 func 必须调用虚拟 C 的 func。 B 的 func 必须是虚拟的,因为 A 有直接继承人。
  • 美学家,好吧,也许吧。现在我使用组合而不是继承。但这并不容易。现在 B 包含 A。

标签: c++ oop virtual


【解决方案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);
  }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      相关资源
      最近更新 更多