c++ 抽象类采用派生类参数

标签 c++ polymorphism abstract-class

我想创建一个带有成员函数的类,该成员函数引用另一个类,其中两个类都派生自抽象类。我收到一个编译器错误,指出类 Container 是抽象的,因为它没有实现 addElem()。

class Ielem
{
public:
  virtual void action() = 0;
};

class Elem: public Ielem
{
public:
  void action() {};
  void extra() {};
};

class Icontainer
{
public:
  virtual void addElem(Ielem &elem) = 0;
};

class Container: public Icontainer
{
public:
  void addElem(Elem &elem) { elem.extra(); };
};

int main(int argc, char* argv[])
{
  Elem e;
  Container c;
  c.addElem(e);

  return 0;
}

这似乎应该可行,因为任何对 Elem 的引用也是对 Ielem 的引用。如果我让 Container::addElem 引用一个 Ielem,它就会编译。但是 Container::addElem() 不能调用 Elem::extra() 除非我使用 dynamic_cast,它在我使用的嵌入式编译器上不可用,或者是类型不安全的常规转换。

建议?

最佳答案

这是错误的方式:基类 Icontainer 指定 addElem 可以将 any Ielem 对象作为一个参数,但在您的派生类中您Elem。这是一个“更窄”的类型,因此违反了基类中指定的契约“我将接受你扔给我的任何 Ielem”。

我认为模板是这里的解决方案。您甚至不再需要基类。像这样:

class Elem
{
public:
  void action() {};
  void extra() {};
};

template<typename ElemType>
class Container
{
public:
  void addElem(ElemType &elem) { elem.extra(); };
};

int main(int argc, char* argv[])
{
  Elem e;
  Container<Elem> c;
  c.addElem(e);

  return 0;
}

作为奖励,您现在可以将 Container 与具有 extra() 函数的任何类型一起使用,并且它会正常工作。

关于c++ 抽象类采用派生类参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12715132/

相关文章:

c++ - 具有不同参数的模板

java - JSON 多态性

python - 如何在 Python 3 中创建具体父类(super class)的抽象子类?

jQuery 'get' 没有从 C++ FastCGI 应用程序(nginx 网络服务器)收到正确的答案

c++ - 具有默认模板参数的转换运算符

c++ - 二维 vector 类成员的迭代器

javascript - AngularJS 如何实现多态/依赖注入(inject)(最佳实践)

c++ - 涉及接口(interface)时如何从库中扩展类?

Java:OOP概念、抽象类、接口(interface)

c++ - 抽象类和模板