【问题标题】:Hierarchy of classes, trying to implement functions at the base level类的层次结构,试图在基层实现功能
【发布时间】:2016-04-12 11:52:11
【问题描述】:

我必须设计一个类的层次结构,例如:

class Animal{
  speak();
  name();
  toString();
...
}

class Dog : public Animal {
  ...;
}

我可以选择是否像这样实现它们:

class Animal{
  virtual speak() = 0;
  virtual name() = 0;
  virtual toString() = 0 ;
...
}

class Dog : public Animal {
  speak(){ ... }
  name(){ ... }
  toString(){ ... }
}

或者,使用指向函数和 lambdas 的指针...像这样:

class Animal{
  speak( s(); );
  name( n(); );
  toString( t(); );
...
protected:
 std::function<...> s();
 std::function<...> n();
 std::function<...> t();
}

class Dog : public Animal {
  Dog(){
    s() = ...;
    n() = ...:
    t() = ...:
  }
}

但是,在第二种情况下,基类不会是抽象的,我不确定这是否是个好主意... 第二种情况是一个非常无用的实现吗? 你能解释一下为什么吗?

【问题讨论】:

  • 您的第一个场景也不代表抽象类?
  • 我应该把函数变成纯虚拟的......不是吗?
  • 当然,如果你想要一个抽象类。
  • 我已经修改了帖子。你能解释一下这两种实现带来的差异吗?

标签: c++ function inheritance lambda


【解决方案1】:

您正在寻找以下方法之间的选择:

第一种方法

class Animal{
  virtual speak() = 0;
  ...
};

class Dog : public Animal {
  speak(){ ... }
  ...
};

第二种方法

class Animal{
  speak( s(); );
  ...
protected:
  std::function<...> s();
  ...
};

class Dog : public Animal {
  Dog(){
    s() = ...;
    ...
  }
};

首选第一种方法。

在第二种方法中,您正在实现您的虚函数调度版本,而不是让编译器为您完成。

【讨论】:

  • 我认为第二种方法在这里有点模棱两可。至少没有第一。
【解决方案2】:

第二种方法允许动态地改变对象的行为。例如。你可以改变动物说话的方式(即使你已经实例化了一个对象)。如果这就是你所拥有的一切,那么你是否需要为动物单独上课甚至是值得怀疑的。只需创建一个工厂。

如果您不需要这种灵活性,那肯定是矫枉过正并增加了复杂性,您应该只使用虚拟方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多