* 实验内容:多态的理解
* 1)子类重写父类非虚函数,并使用父类指针指向子类对象,调用同名函数的结果
* 2)子类重写父类虚函数,并使用父类指针指向子类对象,调用同名函数的结果
* 3)子类能否通过作用域调用父类虚函数?
* 4)父类指针指向子类对象时,能不能直接调用子类中的同名非虚函数?
* 实验结论:1)调用父类非虚函数,因为在编译期,看到是父类指针且调用非虚函数,就会直接找到该函数的入口地址进行绑定;
* 2)调用子类重写函数。
* 3)可以,说明父类的虚函数地址还是保存在子类的虚函数列表中
* 4)不可以,在编译器就会不通过。
*
* 程序介绍:基类(动物类),派生类(狗类、猫类)
* 虚函数(说话),非虚函数(进食)
#include <iostream>
using namespace std;
class Animal {
public:
virtual void speak() {
cout << "动物在说话" << endl;
}
void eat() {
cout << "动物要进食" << endl;
}
};
class Cat : public Animal{
public:
void speak() {
cout << "喵喵喵" << endl;
}
void eat() {
cout << "小猫吃鱼" << endl;
}
};
class Dog : public Animal {
public:
void speak() {
cout << "汪汪汪" << endl;
}
void eat() {
cout << "小狗吃肉" << endl;
}
};
int main() {
Animal* p1 = new Cat();
Animal* p2 = new Dog();
p1->Animal::speak();
p2->Dog::eat(); // 这里,父类指针指向子类对象,但是无法调用子类中的非虚函数,尽管同名。
return 0;
}