gpt4 book ai didi

c++ - 使用指向基类的指针作为数组参数

转载 作者:太空宇宙 更新时间:2023-11-04 15:10:38 24 4
gpt4 key购买 nike

我有 2 个类:

class Base
{
public:
virtual int Foo(int n);
virtual void Goo() = 0;
virtual ~Base() ;
};


class Derived : public Base
{
public:
int Add4Bytes;

void Goo();
int Foo(int n);
};

int Test(Base* b)
{
for (int i=0;i<5;++i)
{
b->Foo(i);
++b;
}
return 0;
}

void Test2(Base arr[])
{
for (int i=0;i<5;++i)
{
arr[i].Foo(i);
}
}

void main
{

Base* b = new Derived[5];
Test(b);
}

因此,当我调用 Test 时,在第二个循环之后出现内存破坏异常。

我有两个问题:

  1. Test 和 Test2 中的函数参数有什么区别? (在我将 Base 变成纯抽象类后,Test2 无法编译)。

还有更重要的问题

  1. 如何防止出现该异常,以及如何将派生类数组传递给假定获取基类数组的函数。 (我无法在编译时告诉我要传递哪个派生类的函数)

p.s - 请不要告诉我阅读 Meyers 的书,这就是我问这个问题的确切原因。 :)

谢谢

最佳答案

参数类型没有区别,数组参数在函数声明中调整为指针。

虽然可以将指向 Derived 的指针转换为指向 Base 的指针,但不能将 Derived 的数组视为数组Base,它们不是相关类型。这是因为在 Derived 数组中,Base 类是 Derived 的子对象,而不是 数组的一部分基地。当您执行指针运算时,就好像它是 Base 数组的一部分一样,您会得到未定义的行为,您可能会构造一个 Base 指针,该指针并不完全指向Base 对象的开始。

关于c++ - 使用指向基类的指针作为数组参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2142611/

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