中,我们创建了一个 Dog 类型的对象 myDog,并将基类的函数指针 eat 指向派生类的方法 Dog_eat。然后设置了狗的年龄为 3。
时间: 2024-12-17 15:55:54 浏览: 2
在面向对象编程中,你提到的情况通常涉及到动态绑定或晚期绑定的概念。当你创建了一个`Dog`类型的对象`myDog`,并且将基类`Animal`的函数指针`eat`指向了派生类`Dog`的具体方法`Dog_eat`,这使得即使`myDog`是一个`Dog`实例,调用`eat`方法时会运行的是`Dog`类特有的`Dog_eat`函数,而不是`Animal`类的通用版本。
例如,在C++中,可以这样做:
```cpp
class Animal {
public:
virtual void eat() { /* 默认行为 */ }
};
class Dog : public Animal {
public:
void eat() override { // 使用override关键字重写父类的eat方法
cout << "Dog is eating." << endl;
}
// 其他Dog类特有属性和方法...
};
Animal* myDog = new Dog(); // 创建Dog对象并将其隐式转换为Animal指针
(*myDog).eat(); // 动态绑定调用Dog_eat方法
// 设置狗的年龄
myDog->age = 3; // 虽然这里设置的是Dog对象的属性,但表示的是Dog对象,不是Animal对象的属性
```
相关问题
派生类的对象的地址可以赋给指向基类的指针举例
好的,我来举个例子。假设有一个基类 Animal,有一个成员函数 eat(),派生类 Dog 继承自 Animal,重写了它的 eat() 函数并添加了一个新的成员函数 bark()。现在我们可以创建一个 Dog 对象,然后将其地址赋给一个指向 Animal 的指针,这样就可以通过该指针来访问 Dog 对象的成员了。代码如下:
```
#include <iostream>
using namespace std;
class Animal {
public:
virtual void eat() {
cout << "Animal is eating." << endl;
}
};
class Dog : public Animal {
public:
void eat() {
cout << "Dog is eating." << endl;
}
void bark() {
cout << "Dog is barking." << endl;
}
};
int main() {
Dog myDog;
Animal* pAnimal = &myDog;
pAnimal->eat(); // 调用的是 Dog 类中的 eat() 函数
// pAnimal->bark(); // 错误,Animal 类没有 bark() 函数
return 0;
}
```
在这个例子中,我们定义了 Animal 和 Dog 两个类,Dog 继承自 Animal,重写了 eat() 函数并添加了一个新的成员函数 bark()。在 main 函数中,我们创建了一个 Dog 对象 myDog,并将其地址赋给一个指向 Animal 的指针 pAnimal。然后我们通过该指针调用了 eat() 函数,由于 eat() 在 Dog 类中被重写了,因此调用的是 Dog 类中的 eat() 函数。但是由于 Animal 类中没有 bark() 函数,因此无法通过 pAnimal 来访问 Dog 对象中的 bark() 函数。
阅读全文