我对虚拟类和封装有一些问题。考虑以下 C++ 程序的最小示例:
#include <iostream>
class IConnection
{
public:
virtual void connect() = 0;
virtual std::string recv() = 0;
virtual void disconnect() = 0;
virtual ~IConnection() {}
};
class ConcreteConnection: public IConnection
{
public:
ConcreteConnection(): m_connected(false) {}
void connect() { m_connected = true; }
std::string recv() { return "Received some text."; }
void disconnect() { m_connected = false; }
private:
bool m_connected;
};
class Container
{
public:
Container() { m_connection = NULL; }
void SetConnection(IConnection *connection) { m_connection = connection; };
void GetData() { std::cout << m_connection->recv() << std::endl; }
~Container() { delete m_connection; }
private:
IConnection *m_connection;
};
int main(void)
{
Container container;
ConcreteConnection *connection = new ConcreteConnection();
container.SetConnection(connection);
container.GetData();
return 0;
}
这个简单的例子效果很好,但我对此并不完全满意。容器对象应该拥有连接,而不受接口 IConnection 的具体实现的干扰。这就是我在容器外创建 ConcreteConnection 对象的原因。我不喜欢的是我必须传递连接的指针或引用。我想传递连接对象的副本,以便主函数在将连接对象传递给容器后没有任何机会操作或删除连接对象。但据我所知,如果不告诉容器它属于哪个 IConnection 的具体实现,就不可能传递连接的副本。
那么你知道如何解决这个问题吗?是否有可能将对象的副本传递给任何函数而不告诉函数该对象属于哪个接口的特定实现?
我对 C++ 和 OOP 都比较陌生,所以不要犹豫,告诉我,如果我的类结构完全错误,并且这种情况不会发生在现实生活中的编程代码中(以及它应该如何工作)。
提前致谢。