前言
如果不使用指针,直接将父类和子类放到同一类型的容器中,比如vector
,那么就算使用子类对象调用成员变量,仍然会调用对应父类的成员变量。
代码
使用子类对象,却调用的父类成员
#include<iostream>
#include<vector>
using namespace std;
class Animal
{
public:
Animal(int num):bark_num(num){
}
virtual void bark() {
cout << "animal bark: " << bark_num << endl; }
protected:
int bark_num;
};
class Dog :public Animal
{
private:
const string dog_name;
public:
Dog(const string& name, int num):Animal(num),dog_name(name){
}
virtual void bark() {
cout << dog_name << " :" << bark_num << endl; }
};
int main()
{
vector<Animal> basket;
Animal animal(3);
Dog dog("dog", 5);
basket.push_back(animal);
basket.push_back(dog); // 这里只会初始化Dog从Animal继承来的内容,它自己的内容会被删掉(slice down)
Animal a = basket.back(); // 本意是弹出dog来使用
a.bark(); // 调用的是Animal的bark
return 0;
}
使用父类对象指针,调用子类成员
使用父类对象类型的指针,但是指向子类对象,由于动态绑定的关系,调用的就是子类成员。
#include<iostream>
#include<vector>
using namespace std;
class Animal
{
public:
Animal(int num):bark_num(num){
}
virtual void bark() {
cout << "animal bark: " << bark_num << endl; }
protected:
int bark_num;
};
class Dog :public Animal
{
private:
const string dog_name;
public:
Dog(const string& name, int num):Animal(num),dog_name(name){
}
virtual void bark() {
cout << dog_name << " :" << bark_num << endl; }
};
int main()
{
vector<shared_ptr<Animal>> basket;
basket.push_back(make_shared<Animal>(3));
basket.push_back(make_shared<Dog>("dog", 5)); // 因为basket是Animal类型的指针,相当于用Aninal类型的指针指向了Dog对象
// 那么调用的就是指针指向的对象的成员变量
shared_ptr<Animal> a = basket.back();
a->bark();
return 0;
}