ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 用于虚函数返回的枚举变量

2019-07-23 07:04:36  阅读:316  来源: 互联网

标签:c c11 enums covariance


为什么C不能识别枚举MyEnum:int作为int的共变体?

示例:http://ideone.com/Ns1O2d

#include <iostream>

enum FooType : int
{
    Crazy = 0,
    Cool
};

enum BarType : int
{
        Hello = Cool + 1,
        World
};

class Foo
{
public:
        Foo(void)
        {
        }

        ~Foo(void)
        {
        }

        virtual int getType(void) 
        {
                        return Crazy;
        }
};

class Bar : public Foo
{
public:
        Bar(void)
        {
        }

        ~Bar(void)
        {
        }

        virtual BarType getType(void)
        {
                return Hello;
        }
};

int main(int argc, char* argv[])
{
        Bar f = Bar();           
        std::cout << f.getType() << std::endl;
        return 0;
}

编译错误:

prog.cpp:43:18: error: conflicting return type specified for 'virtual BarType Bar::getType()'
prog.cpp:26:14: error:   overriding 'virtual int Foo::getType()'

解决方法:

非范围的枚举类型(即通常的枚举,而不是枚举类和枚举结构)提供对整数的隐式提升,即您可以这样做:

enum FooType : int { Crazy, Cool };
int val = Crazy; // promotion to integer

但是,这不起作用:

FooType val = 0;  // illegal

这遵循§7.2/ 5:每个枚举定义一个与所有其他类型不同的类型,结合§7.2/ 9:枚举器的值或未作用域的枚举类型的对象通过整数提升转换为整数.

我相信这条规则的原因很明显:可以有(通常是)整数值,没有定义相应的枚举数.在上面的示例中,理论上可以转换0和1,但无法转换转换2或任何更大的数字.

但是,如果枚举与其基础类型(在您的示例中为int)协变,则在您定义它的意义上,以下是可能的:

class Foo
{
public:
  virtual ~Foo(void) {}
  virtual int getType(void) 
  {
    return Crazy;
  }
};

class Bar : public Foo
{
public:
  virtual ~Bar(void) {}
  virtual BarType getType(void)
  {
    return Foo::getType();
  }
};

在派生类中,Bar :: getType()现在已被定义为返回BarType,但它通过调用继承的函数Foo :: getType()来完成此操作,这完全是合法的.

如果这是可能的,那么Bar :: getType()必须将从Foo :: getType()得到的int隐式转换为int.如上所述,这不可能.

但是,您仍然可以通过以与Foo:getType相同的方式声明Bar :: getType来实现您的代码似乎意图,并返回一个BarType(隐式提升为int):

class Bar : public Foo
{
public:
  virtual ~Bar(void) {}
  virtual int getType(void)
  {
    return Hello;
  }
};

请注意,这仅在底层类型为int时才有效(因为它是在枚举声明中将其固定为int),并且枚举不是作用域的(即不使用枚举类或枚举结构).

标签:c,c11,enums,covariance
来源: https://codeday.me/bug/20190723/1511324.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有