要解决这个问题,我们需要提供更多的上下文和相关的代码示例。因此,我将以以下代码示例为基础进行解答:
#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不会返回正确的标记。