类的多态性:成员变量与成员方法访问特点(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()+ "岁啦");
}
}
执行结果: