gpt4 book ai didi

具有相同函数名的 C++ 继承

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:59:38 26 4
gpt4 key购买 nike

如果这个答案已经在这个网站上,我很抱歉,但我已经查看了所有内容,但找不到任何解决我的问题的方法。它适用于继承类的同名函数。这是我的代码:

class A
{
public:
int foo(int c) { c = c+1; return c; };
};

class B : public A
{
public:
int foo(int c) { c = c-1; return c; };
};

int main()
{
A array[2];
array[0] = A item1;
array[1] = B item2;
for (int n=0;n<2;n++)
{
cout << array[n].foo(10) << endl;
}
return 0;
}

我期望的输出是:

11    // foo() from A class  [10 + 1 = 11]
9 // foo() from B class [10 - 1 = 9 ]

但是我得到了

11
11

通过测试,我发现 B 类中的 foo() 函数不会在 for 循环中被调用。相反,A 类中的 foo() 函数被调用,甚至在数组 [1] 中的 B 对象上也是如此。

这是因为我将数组定义为仅包含 A 类的对象吗?如果是这样,有没有办法让 B 类的 foo() 函数在该 for 循环中的第二个对象上被调用?

提前感谢您的帮助!

最佳答案

我会忘记 array[0] = A item1; 不是有效的 C++,只是假设您正在将 A 类型的对象分配给 array[0]B 类型的对象到 array[1]。好的,所以你有两个问题。

第一个称为对象切片。当您将 B 类型的对象复制到 A 类型的对象时,您只复制该对象的 A 部分。所以你在 array[1] 中拥有的根本不是 B,它只是一个 A。如果你想要多态性(你这样做),那么你需要使用提供多态行为的指针或引用。这意味着使您的数组成为 A* array[2]; 并执行 array[0] = &item1; array[1] = &item2;.

现在,当您在指向 A 的指针上调用一个指向 B 的函数时,它仍然只会调用 Afoo 成员函数。为什么?因为默认情况下,函数将在对象的静态类型 上查找。该静态类型是 A。如果你想告诉编译器在你的对象的动态类型上查找你的函数 - 你的对象的 true 类型,即 B - 您需要将该成员函数设为虚拟。所以在 A 中,做:

virtual int foo(int c) { c = c+1; return c; };

现在,当您的编译器看到您在 A* 上调用 foo 时,它会看到它是虚拟的并说“哦,好吧,我应该查一下这个函数是动态的”,它会找到 Bfoo 的实现。

关于具有相同函数名的 C++ 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13711790/

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