类的多态性:成员变量与成员方法访问特点(C++、Java)

类的多态性:成员变量与成员方法访问特点(C++、Java)

1.C++与Java语言中类的多态格式为:

C++:父类名称 &引用对象名 = 子类名称 对象名
Java:父类名称 对象名 = new 子类名称

2.对成员变量与成员方法(函数)访问特点一致,规律如下:
对于成员变量,代码编译和执行时都看父类,以父类为依据(有无及值以父类为标准);
对于成员方法,编译时以父类为依据(父类无则编译报错),执行时以子类为依据(执行子类方法),但前提是子类必须对方法进行重载,在C++中父类函数还必须为虚函数。
3.验证
C++代码(完整版):

#include<iostream>
using namespace std;

class Animal
{
    
    
	public:
		string name="animal";
		int age=10; 
		virtual void eat()
		{
    
    cout<<name<<"吃东西"<<endl; 
		}
		virtual string getname()
		{
    
    return name;
		}
		virtual int getage()
		{
    
    return age;
		}
		int speak()
		{
    
    cout<<name<<"在说话"<<endl; 
		}
};
class Cat:public Animal
{
    
    
	public:
		string name="Tom";
		int age=3; 
		void eat()
		{
    
    cout<<name<<"吃鱼"<<endl; 
		}
		string getname()
		{
    
    return name;
		}
		int getage()
		{
    
    return age;
		}
		void work()
		{
    
    cout<<name<<"会抓老鼠"<<endl;
		}
};
class Dog:public Animal
{
    
    
	public:
		string name="旺财";
		int age=5; 
		void eat()
		{
    
    cout<<name<<"吃SHIT"<<endl;
		}
		void work()
		{
    
    cout<<name<<"会看门"<<endl; 
		}
		int speak()
		{
    
    cout<<name<<"汪汪叫"<<endl; 
		}
};

void test()
{
    
    
	Cat cat;
	Animal &animal1 = cat;	 //多态实现 
	cout<<"直接访问共有成员方法:"; 
	animal1.eat();		//虚函数重载后执行子类方法 
	cout<<"直接访问成员变量:"<<animal1.name<<"今年"<<animal1.age<<"岁啦"<<endl;	//成员变量一定返回父类的 
	cout<<"通过成员方法间接访问成员变量:"<<animal1.getname()<<"今年"<<animal1.getage()<<"岁啦"<<endl;	//可以通过虚函数的方法间接调用子类成员变量 
	//animal1.work();	//父类无此方法,不能访问,编译错误 
	cout<<"======================================================"<<endl;
	Dog dog;
	Animal &animal2 = dog;
	cout<<"直接访问共有(重载过)成员方法:"; 
	animal2.eat();
	cout<<"直接访问成员变量:"<<animal2.name<<"今年"<<animal2.age<<"岁啦"<<endl;
	cout<<"通过成员方法间接访问成员变量:"<<animal2.getname()<<"今年"<<animal2.getage()<<"岁啦"<<endl;
	cout<<"调用共有非虚函数方法:";
	animal2.speak();	//非虚函数重载后一定会执行父类方法 
}
int main()
{
    
    
	test();
	return 0;
} 

执行结果:
在这里插入图片描述
Java代码(部分,可通过增添注释验证):
Animal类:

package 多态验证;

public class Animal {
    
    
	String name = "animal";
	int age = 10;
	public void eat()
	{
    
    System.out.print(name + "吃东西");
	}
	public String getname()
	{
    
    return name;
	}
	public int getage()
	{
    
    return age;
	}
}

Cat类:

package 多态验证;

public class Cat extends Animal{
    
    
	String name = "Tom";
	int age = 3;
	public void eat()
	{
    
    System.out.println(name + "吃鱼");
	}
	public String getname()
	{
    
    return name;
	}
	public int getage()
	{
    
    return age;
	}
}

主函数:

package 多态验证;

public class test {
    
    
	public static void main(String[] args) {
    
    
		test0();
	}
	public static void test0(){
    
    
		Animal animal = new Cat();
		System.out.print("直接访问共有成员方法:");
		animal.eat();
		System.out.println("直接访问成员变量:" + animal.name + "今年" + animal.age+ "岁啦");
		System.out.println("通过成员方法间接访问成员变量:" + animal.getname() + "今年" + animal.getage()+ "岁啦");
	}
}

执行结果:在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/hyl1181/article/details/107708820