我确实知道一些多态,但我在这里有点迷失,在从B
到A
的隐式转换中调用来自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
,或仅仅因为禁止无谓的事情不重要?
答案 0 :(得分:2)
A& a = (A)b;
这会创建一个A
类型的临时对象,复制b
的基类部分。然后它尝试引用这个临时的。
幸运的是,C ++语言不允许你对临时的(非常量)引用,防止你意外地犯这种错误。
不幸的是,你的编译器提供了一个允许你这样做的“语言扩展”,所以如果你必须使用那个编译器,那么你需要更加小心。
一般来说,避免像瘟疫这样的C式演员阵容。如果确实需要显式转换,请使用最严格的C ++样式转换,以帮助编译器捕获错误。
此外,是否有理由不禁止
A& extra = extra
,或仅仅因为禁止无谓的事情不重要?
没有充分理由允许这样做;据推测,它是不被禁止的,因为禁止在不禁止int i, &r=i;
或void *p = &p;