显式转换与隐式使用带虚函数的引用

时间:2013-03-04 01:16:32

标签: c++ reference polymorphism type-conversion

我确实知道一些多态,但我在这里有点迷失,在从BA的隐式转换中调用来自B的方法但是明确了调用来自A的方法,这是有意义的,但它只在方法是虚拟的情况下才这样工作,否则在两种情况下都输入ShowA(来自类A的方法被调用)。

class A
{
public:
    A(){};
    ~A(){}
public:
    int n;
      virtual void Show(){ cout << "ShowA" << endl;  };
};

class B : public A
{
public:
    B(){};
    ~B(){}
     virtual void Show() { cout << "ShowB" << endl; }
};


int _tmain(int argc, _TCHAR* argv[])
{
    B b;
    A& a = b; //ShowB
    A& a = (A)b; //ShowA
    a.Show();

    //Extra:
    A& extra = extra;

    return 0;
}

此外,是否有理由不禁止A& extra = extra,或仅仅因为禁止无谓的事情不重要?

1 个答案:

答案 0 :(得分:2)

A& a = (A)b;

这会创建一个A类型的临时对象,复制b的基类部分。然后它尝试引用这个临时的。

幸运的是,C ++语言不允许你对临时的(非常量)引用,防止你意外地犯这种错误。

不幸的是,你的编译器提供了一个允许你这样做的“语言扩展”,所以如果你必须使用那个编译器,那么你需要更加小心。

一般来说,避免像瘟疫这样的C式演员阵容。如果确实需要显式转换,请使用最严格的C ++样式转换,以帮助编译器捕获错误。

  

此外,是否有理由不禁止A& extra = extra,或仅仅因为禁止无谓的事情不重要?

没有充分理由允许这样做;据推测,它是不被禁止的,因为禁止在不禁止int i, &r=i;void *p = &p;

之类的合法声明的情况下禁止它是相当复杂的