1

在 C++ 中,如果我有一个类Base是私有基类DerivedBase没有虚函数,那么用类中的封装代替继承会更干净Encapsulate吗?我想在这种情况下继承的唯一好处是可以在派生类中直接访问基类,而不是通过memberVariable。一种或另一种做法被认为更好,还是更多的是个人风格问题?

class Base {
  public:
    void privateWork();
    // No virtual member functions here.
};

class Derived : Base {
  public:
    void doSomething() {
      privateWork();
    }
};

class Encapsulate {
    Base memberVariable;

  public:
    void doSomething() {
      memberVariable.privateWork()
    }
};
4

2 回答 2

2

如果没有virtual函数,则不应在 OO 中使用继承。请注意,这并不意味着一定不能使用它,在少数(有限的)情况下,您可能需要(ab)将继承用于 OO 以外的其他目的。

于 2012-07-02T20:55:34.260 回答
2

请记住,继承模型“Liskov 替换”:当且仅当您可以将 Foo 变量传递给期望 Bar 的每个函数时,Foo 才是 Bar。私有继承不会对此建模。它对组合进行建模(Foo 是根据 Bar 实现的)。

现在,您几乎应该总是使用第二个版本,因为它更简单并且更好地表达了意图:对于不了解它的人来说,它不会令人困惑。

但是,有时,私有继承很方便:

class FooCollection : std::vector<Foo>
{
public:
    FooCollection(size_t n) : std::vector<Foo>(n) {};

    using std::vector<Foo>::begin;
    using std::vector<Foo>::end;
    using std::vector<Foo>::operator[];
};

这允许您重用 的某些功能,vector而无需手动转发 begin、end 和operator[].

在这种情况下,您根本没有多态性:这不是继承,这是组合是伪装;您无法将 aFooCollection用作向量。特别是,您不需要虚拟析构函数。

于 2012-07-03T06:30:02.357 回答