0

我确实知道一点多态性,但在这里我有点迷失了,关于隐式转换 fromBA方法 fromB被调用,但显式调用方法 from 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的,还是仅仅因为禁止无意义的事情不重要?

4

1 回答 1

2
A& a = (A)b;

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

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

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

一般来说,避免像瘟疫一样的 C 风格的演员表。当您确实需要显式转换时,请尽可能使用最严格的 C++ 样式转换,以帮助编译器捕获错误。

另外不被禁止是有原因A& extra = extra的,还是仅仅因为禁止无意义的事情不重要?

没有充分的理由允许这样做。int i, &r=i;据推测,它不是被禁止的,因为在不禁止合法声明的情况下禁止它会相当复杂void *p = &p;

于 2013-03-04T01:37:17.323 回答