首页 > 解决方案 > 如何添加最终覆盖

问题描述

如何添加“最终覆盖”来解决此问题?

#include <iostream>

struct Shape
{
  virtual void print()
  {
    std::cout << "SHAPE" << std::endl;
  }
  virtual ~Shape() {}
};

struct Box : public virtual Shape
{
  void print() 
  {
    std::cout << "BOX" << std::endl;
  }
};

struct Sphere : public virtual Shape
{
  void print() final override
  {
    std::cout << "SPHERE" << std::endl;
  }
};

struct GeoDisc : public Box, public Sphere
{
};

int main(int argc, char** argv)
{
  Shape* s = new GeoDisc;

  s->print();

  delete s;

  return 0;
}

这是错误消息:
31:8:错误:'GeoDisc' 中的 'virtual void Shape::print()' 没有唯一的最终覆盖

标签: c++c++11

解决方案


虚拟方法声明中的关键字final防止多重继承,所以如果我试图在这种情况下解决歧义,这是一种错误的方法。如果 Box 和 Sphere 都有最终决定,您将收到错误消息“虚拟函数 'Shape::print' 在 'GeoDisc' 中有多个最终覆盖器”。法律上的歧义解决方案是:

struct Sphere : public virtual Shape
{
  void print() override
  {
    std::cout << "SPHERE" << std::endl;
  }
};

struct GeoDisc : public Box, public Sphere
{
  void print() final override
  {
    Sphere::print();
  }
};

推荐阅读