要解决这个问题,我们需要提供更多的上下文和相关的代码示例。因此,我将以以下代码示例为基础进行解答:
#include
class Animal {
public:
virtual void eat() {
std::cout << "Animal is eating" << std::endl;
}
};
class Bison : public Animal {
public:
void eat() override {
std::cout << "Bison is eating" << std::endl;
}
};
int main() {
Animal* animal = new Bison();
animal->eat();
return 0;
}
在这个示例中,我们定义了一个基类 Animal 和一个派生类 Bison。派生类 Bison 重写了基类的 eat() 函数。
然而,当我们尝试通过基类指针调用 eat() 函数时,程序执行时将会出现问题,因为基类的 eat() 函数没有被声明为虚函数。这样,尽管我们通过 new Bison() 创建了一个 Bison 对象,但基类指针 animal 只会调用基类的 eat() 函数。
为了解决这个问题,我们需要将基类的 eat() 函数声明为虚函数。修改代码如下:
#include
class Animal {
public:
virtual void eat() {
std::cout << "Animal is eating" << std::endl;
}
};
class Bison : public Animal {
public:
void eat() override {
std::cout << "Bison is eating" << std::endl;
}
};
int main() {
Animal* animal = new Bison();
animal->eat();
delete animal;
return 0;
}
现在,基类的 eat() 函数被声明为虚函数,因此通过基类指针调用 eat() 函数时,程序将会调用派生类 Bison 的 eat() 函数,输出 "Bison is eating"。同时,我们还在程序结束时删除了动态分配的内存,以避免内存泄漏的问题。
下一篇:Bison不会返回正确的标记。