gpt4 book ai didi

c++ - 显式转换与隐式使用虚函数引用

转载 作者:行者123 更新时间:2023-11-28 03:21:49 25 4
gpt4 key购买 nike

我确实知道一点多态性,但我在这里有点迷路,关于从 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 没有被禁止是有原因的,还是仅仅因为被禁止的无意义的东西没有什么重要性?

最佳答案

A& a = (A)b;

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

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

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

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

In addition is there a reason why A& extra = extra isn't forbidden, or simply because there is little importance to forbidden senseless things?

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

关于c++ - 显式转换与隐式使用虚函数引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15193061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com