C++ 类的层次结构,尝试在基础级别实现函数

C++ 类的层次结构,尝试在基础级别实现函数,c++,function,inheritance,lambda,C++,Function,Inheritance,Lambda,我必须设计类的层次结构,例如: class Animal{ speak(); name(); toString(); ... } class Dog : public Animal { ...; } 我可以选择是否这样实施它们: class Animal{ virtual speak() = 0; virtual name() = 0; virtual toString() = 0 ; ... } class Dog : public Animal { sp

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

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(){ ... }
}
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() = ...:
  }
}
或者,在指向函数和lambda的指针中练习。。。像这样:

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

class Dog : public Animal {
  speak(){ ... }
  name(){ ... }
  toString(){ ... }
}
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() = ...:
  }
}
类动物{
说话;
名称(n(););
toString(t(););
...
受保护的:
std::函数s();
std::函数n();
std::函数t();
}
犬类:公共动物{
狗(){
s()=。。。;
n()=…:
t()=…:
}
}
但是,在第二个场景中,基类不会是抽象的,我不确定这是否是一个好主意。。。 第二种情况是非常无用的实现吗?
你能解释一下为什么吗

您需要在以下方法中进行选择:

第一种方法

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

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

class Dog : public Animal {
  Dog(){
    s() = ...;
    ...
  }
};
第二种方法

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

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

class Dog : public Animal {
  Dog(){
    s() = ...;
    ...
  }
};
类动物{
说话;
...
受保护的:
std::函数s();
...
};
犬类:公共动物{
狗(){
s()=。。。;
...
}
};
我更喜欢第一种方法


在第二种方法中,您正在实现您的虚拟函数分派版本,而不是让编译器为您执行。第二种方法允许动态更改对象的行为。例如,你可以改变动物说话的方式(即使在你实例化了一个对象之后)。如果这就是你所拥有的一切,那么你是否需要为这些动物设置单独的课程就更值得怀疑了。创建一个工厂


如果您不需要这种灵活性,那么这肯定是一种过分的做法,增加了复杂性,您应该只使用虚拟方法。

您的第一个场景也不代表抽象类?我应该让函数纯虚拟化。。。是吗?当然,如果你想要一个抽象类,我已经修改了帖子。你能给我解释一下这两种实现带来的差异吗?我认为第二种方法有点模棱两可。至少没有第一个。