c++将父类和子类放到同一个容器中,并实现各自的成员函数

前言

如果不使用指针,直接将父类和子类放到同一类型的容器中,比如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;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sdhdsf132452/article/details/129874925