已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。
昨天关门了。
Improve this question
一个类有许多纯虚函数。遵循C++组合的概念,为它创建一个 Package 器来提供纯虚函数的具体实现。由于 Package 器和它所 Package 的类的内存占用是相同的,让 Package 器继承类是一个好的实践吗?
下面的代码就是一个例子
class Foo
{
public:
virtual void method_1() = 0;
// ...
virtual void method_n() = 0;
};
class FooWrapper : public Foo
{
public:
FooWrapper(Foo& foo) : foo_(foo) {}
void method_1() override {foo_.method_1();}
// ...
void method_n() override {foo_.method_n();}
private:
Foo& foo_;
};
对利弊的明确解释是非常赞赏的。
1条答案
按热度按时间qxgroojn1#
这个类 * 是一个 *
Foo
**,**它还 * 包含 * 另一个Foo
。每个
FooWrapper
类型的对象包含两个Foo
类型的对象:基类子对象和数据成员。注意,由于问题已经过编辑,我们仍然应该说每个
FooWrapper
对象都与两个Foo
类型的对象 * 关联 *:基类子对象和它所引用的子对象。这似乎没有任何意义。
您需要首先确定抽象基类和具体实现子类的语义,以及如何使用它们。
例如,“ Package ”某个东西通常意味着隐藏它,而实现一个抽象基类通常意味着公开它的公共接口。它几乎与 Package 相反。除非你想把它隐藏在其他东西里面(或者至少提供一个替代接口),否则你不会 Package 它。
为了达到完美的清晰度:
让 Package 器继承类是一个好的实践吗?
不,它不会实现任何东西,除非你有一些非常具体的情况,你相信它 * 确实 * 实现了一些东西,在这种情况下,你应该问一个关于这种情况的问题。
它的 Package 器被创建来提供纯虚拟功能的具体实现
那不是 Package 器的本质。 Package 器 Package 了一些东西。你知道,就像提供一个外层,它与被 Package 的对象有些不同。公共继承不做这件事,所以一个公共继承的基类在任何意义上都不会被派生类 Package 。