gpt4 book ai didi

c++ - C++如何从指针数组访问子类虚函数

转载 作者:行者123 更新时间:2023-12-01 14:57:41 24 4
gpt4 key购买 nike

我有这样定义的指针数组:

Person *people[2];

如果我将其填充到main函数中,则该程序可以正常运行,并且我的子类可以访问其方法:
int main(int argc, const char * argv[]) {

Person *people[2];

Person p1 = Person();
Child c1 = Child();

people[0] = &p1;
people[1] = &c1;

speak(people);

return 0;
}


void speak(Person** people) {
for (int i = 0; i < 2; i++) {
people[i]->speak();
}
}

但是,如果我创建一个单独的方法来填充指针数组,则speak()方法不会将第二个指针识别为指向我的子对象的指针:
int main(int argc, const char * argv[]) {

Person *people[2];

populate(people);

speak(people);

return 0;
}

void populate(Person** people) {

Person p1 = Person();
Child c1 = Child();

people[0] = &p1;
people[1] = &c1;
}

void speak(Person** people) {
for (int i = 0; i < 2; i++) {
people[i]->speak();
}
}

我的第二个示例到底是什么问题,该示例导致speak()方法在循环的第二次迭代中失败?这两个示例与我看起来完全相同,唯一的警告是populate()方法。

这是我的Person和Child类的类定义:
class Person {
public:
virtual void speak();
private:
string first;
string last;
int age;
};

void Person::speak() {
cout << "Hello! I'm a person!" << endl;
}

class Child: public Person {
public:
virtual void speak();
private:
string face;
};

void Child::speak() {
cout << "Hello! I'm a child!" << endl;
}

非常感谢所有帮助!

最佳答案

populate中,当您执行people[0] = &p1;时,您正在分配临时(堆栈本地)变量的地址。

从函数返回后,变量p1死亡,并且person指向无效内存。尝试从main访问此内存将调用未定义的行为。

您可以通过在堆中为传入的指针分配内存来解决此问题:

void populate(Person** people) {

people[0] = new Person();
people[1] = new Child();
}

这是一个有效的 demo

在没有 populate的版本中,它起作用是因为您调用地址的那些局部变量在 speak调用期间一直存在。

关于c++ - C++如何从指针数组访问子类虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61705395/

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