gpt4 book ai didi

c++ - 虚函数疑点

转载 作者:行者123 更新时间:2023-11-30 05:17:18 26 4
gpt4 key购买 nike

我有这个简单的代码来测试 VF

class A
{
public:
virtual const char Get (){return 'A';}
};

class B : public A
{
public:
const char Get (){return 'B';}
};

class C : public B
{
public:
const char Get (){return 'C';}
};

class D : public C
{
public:
const char Get (){return 'D';}
};

在 main () 中

D dD;
std::cout<<dD.Get()<<std::endl; //prints D

A & rA = dD;
std::cout<<rA.Get()<<std::endl;//prints D

C cC;

A & rA2 = cC;
std::cout<<rA2.Get()<<std::endl; //print C

B & rB = dD;
std::cout<<rB.Get()<<std::endl;
/*????? it prints D, shouldn't it print B ?????*/

rB 指向地址 dD,rB 只会引用 dD 对象的对象(B 和 A)(不会看到 C&D)。

当rB.Get()被调用时,不是应该去B中最派生的函数,而不是A中去执行吗?

最佳答案

当函数在类 Base 中是虚函数时,它在所有派生类、从派生类派生的类等中都是虚函数,无论是否使用 virtual 在派生类中。

在您的情况下,这意味着 Get 在您的所有类 ABCD。因此,案例 rArB 是同类情况的示例。

返回类型可能略有不同:原始引用或指针作为返回类型可以专门用于派生类。由于它随后在与包含类相同的方向上发生特异性变化,因此称为协变返回类型。但是,C++ 不支持参数的变化。

关于c++ - 虚函数疑点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42184573/

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