我想创建一个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.
答案 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)
您可以使用继承访问说明符尝试某些操作。如果您不知道它是如何工作的,请看看: