多态

类的继承和派生(自我总结)

南笙酒味 提交于 2019-12-02 06:48:05
在派生类中: 无论是哪种继承都 不可以直接访问 上一级类继承下来私有成员 不可以直接访问 public protected 对于protect和public则根据继承方式的不同而不同, 继承方式的不同限制的是派生类对象对基类的访问 。 在派生类内部中: 无同名函数 可以访问除开基类私有成员的任何成员 有同名函数(同名就行) 派生类中的同名函数隐藏基类中的同名函数 可以通过类名::函数进行区分 可能会引发二异性(继承来的函数同名[同一等级]) protected继承与private继承的差别: protected不会继承到没有 —— private会继承到不能访问 只继承一次是看不出来差距的 类型转换 公有派生类对象(public方式) 可以被当作基类的对象使用,反之则不可以. 公有派生使得基类的对外访问接口是不变的 派生类的对象可以隐含转换为基类对象; 派生类对象可以初始化基类的引用 派生类的指针可以隐含转换为基类的指针 通过基类对象名、指针只能使用从基类继承的成员 不要重新定义继承而来的非虚函数 ,使得同名函数被覆盖掉,使用虚函数更加满足多态需求 派生类不能继承的基类成员 缺省构造函数,拷贝构造函数,拷贝赋值函数,以及析构函数这四种成员函数被称作特殊的成员函数 构造函数 未继承基类构造函数,那么使用派生类构造函数进行统一初始化 C++11规定: 可用using

类的多态

此生再无相见时 提交于 2019-12-02 06:47:59
运算符重载 不能重载的运算符 类属关系运算符“.” 成员指针运算符“.*” 作用域分辨符“::” 三目运算符“?:” 重载运算符 重载运算符函数必须要有重载的类在参数里面 成员重载运算符 调用时,必须是类对象进行调用,且会将自己自动传入做 this 双目运算符操作时,该类对象必须出现在左边,以进行调用 单目运算符操作时,int有是后置++/--,无是前置++/-- 非静态成员 #include using namespace std; class Clock { public: Clock(int hour = 0, int minute = 0, int second = 0); void showTime() const; Clock &operator++(); //前置单目运算符 Clock operator++(int); //int用于区分前置还是后置运算符 后置单目运算符 private: int hour, minute, second; }; void Clock::showTime() const{ cout 非成员运算符 用来解决调用对象不是类对象的情况(但参数还是要有类对象存在) 非成员 #include using namespace std; //非成员函数解决"复数+类"的情况,成员的运算符重载只能做到第一个参数是类类型的 class Complex

C++ 虚函数

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-02 06:40:58
1.虚函数: 用virtual定义的非static实例成员函数,虚函数可表现多态性,非虚函数的执行效率比较高,但是不能表现多态性; .虚函数总是有this,故参数后面可出现const 和 volatile,而staic成员函数无 this,故参数表后不可出现const 和 volatile,所以virtual 和 static 不能同时出现,否则关于this是矛盾的; 动态多态:重载函数表现的是静态(编译时)多态性,虚函数表现的是动态(运行时)的多态,多态一般指动态的编译; 重载函数是 静态多态函数 ,通过早期绑定调用重载函数,虚函数是动态多态函数,通过晚期绑定调用函数; 晚期绑定 是程序运行时由程序自己完成的, 早期绑定 是编译或者操作系统完成的; 虚函数的晚期绑定通过存储在对象中的一个指向虚函数入口 地址表 VFT的指针完成; 虚函数 一般 在基类的public或protected部分,在派生类中定义取代型函数时,函数原型必须和基类的虚函数必须完全相同;无论是否使用virtual保留字都将成为虚函数; 虚函数 只有 在具有继承关系的类称重才需要表现多态, union 既不能作为基类,也不能作为派生类,故 union 不能定义为虚函数; 构造对象 时类型是确定的,不需要根据类型不同表现为不同多态行为,故 构造函数 不能定义为虚函数; 析构函数 可通过父类指针

永不服输的Java之路---重学Java (第七章)

99封情书 提交于 2019-12-02 06:39:19
如若文章中出现冲突,或者出现错误,请联系 QQ:2669157689 指出我的问题。谢谢~ 介绍Java中类的继承,封装,多态,方法的覆盖,抽象类、接口及内部类等面向对象的高级特性。通过本课的学习,我们应该掌握如下知识: 类的继承、封装、多态 抽象类及接口 引用数据类型的转换 访问权限修饰符的使用 final关键字 JAVA编程基础 —— 面向对象高级特性 1. 类的继承 ① 类的继承 在 Java 中定义一个类时,让该类通过关键字 extends 继承一个已有的类,这就是类的继承(泛化) 被继承的类称为父类(超类,基类),新的类称为子类(派生类) 子类继承父类的所有属性和方法,同时也可以增加自己的属性和方法 ② 继承的语法和规则 继承的语法 [修饰符] class 子类名 extends 父类名 继承的优点:使编码更高效、易维护、代码的重用 继承的规则: Java中只支持单继承,也就是说每个类只能有一个父类,不允许有多重继承 一个父类可以有多个子类 子类继承父类所有的属性和方法 ③ 子类实例化的过程 子类实例化时先实例化其父类,然后实例化子类 要先调用父类的构造器,父类构造器运行完毕,才调用子类的构造器 子类的构造器 — 子类不能继承父类的构造器 使用默认的构造器. 在子类中的创建构造器 在子类中创建构造器时,必须调用父类的构造器 子类可以在自己的构造器中使用 super

Java继承和多态

北慕城南 提交于 2019-12-02 06:23:22
Java的继承和多态 继承 1.子类可以从父类继承属性和方法 2.子类的继承性 (1)子类和父类在同一个包中 父类中除private定义的变量或方法均可继承 (2)子类和父类不在同一个包中 子类继承了public 和protected定义的方法和对象 3.子类对象的构造过程 (1)子类对象化时,判断是否有父类,有则先调用父类构造器,完成父类成员变量的初始化后调用子类·自己的构造器 (2)super指定父类构造器 使用时必须在构造器的第一行。当父类成员和子类成员冲突时使用super.成员可区分· 4.对象的上转型对象 父 a; a = new 子(); 5.覆盖与多态 Override (1)子类重写父类某个方法 (2)不管对象是什么类型,调用方法都是new后构造器所在类的方法 (3)为防止方法被覆盖,可用final修饰 多态 一个方法的多种实现 public class textextends { //测试继承 public static void main ( String [ ] args ) { Student stu = new Student ( ) ; stu . name = "h" ; stu . height = 180 ; stu . rest ( ) ; Student stu2 = new Student ( "l" , 18 , "medical

2019/10/23 动手动脑--- 多态测试

笑着哭i 提交于 2019-12-02 04:37:46
多态测试: 代码: package com.javaclass4; public class ParentChildTest { public static void main(String[] args) { Parent parent=new Parent(); parent.printValue(); Child child=new Child(); child.printValue(); parent=child; parent.printValue(); parent.myValue++; parent.printValue(); ((Child)parent).myValue++; parent.printValue(); } } class Parent{ public int myValue=100; public void printValue() { System.out.println("Parent.printValue(),myValue="+myValue); } } class Child extends Parent{ public int myValue=200; public void printValue() { //super.printValue(); System.out.println("Child.printValue()

10.21 继承与多态动手动脑

。_饼干妹妹 提交于 2019-12-02 03:40:18
1. 运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是否是第一句,影响重大! class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } public Grandparent(String string) { System.out.println("GrandParent Created.String:" + string); } } class Parent extends Grandparent { public Parent() { //super("Hello.Grandparent."); System.out.println("Parent Created"); // super("Hello.Grandparent."); } } class Child extends Parent { public Child() { System.out.println("Child Created"); } } public class TestInherits { public static void main

继承与多态感想

♀尐吖头ヾ 提交于 2019-12-02 03:24:47
1.运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是否是第一句,影响重大! package 继承; class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } public Grandparent(String string) { System.out.println("GrandParent Created.String:" + string); } } class Parent1 extends Grandparent { public Parent1() { //super("Hello.Grandparent."); System.out.println("Parent Created"); // super("Hello.Grandparent."); } } class Child1 extends Parent1 { public Child1() { System.out.println("Child Created"); } } public class TestInherits { public

继承与多态之动手动脑

ⅰ亾dé卋堺 提交于 2019-12-02 03:23:35
继承与多态 一、继承条件下的构造方法的调用 class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } public Grandparent(String string) { System.out.println("GrandParent Created.String:" + string); } } class Parentt extends Grandparent { public Parentt() { super("Hello.Grandparent."); System.out.println("Parent Created"); // super("Hello.Grandparent."); } public Parentt(String s) { System.out.println("Parent Created.String:"+s); } } class Childd extends Parentt { public Childd() { super("Hello.Parent."); System.out.println("Child Created"); } } public class TestInherits { public

java-多态

浪子不回头ぞ 提交于 2019-12-02 02:46:50
一句话:父类引用指向子类对象 格式: 父类名称 对象名 = new 子类名称() 或者 接口名称 对象名 = new 实现类名称() public class Fu { public void main() { System.out.println("父类方法"); } public void mainTest() { System.out.println("父类特殊方法"); } } public class Zi extends Fu{ @Override public void main() { System.out.println("子类方法"); } } public class Mulituplate { public static void main(String[] args) { Fu objFu = new Zi(); objFu.main(); objFu.mainTest(); } } 访问成员变量: 直接通过对象名称访问成员变量,谁是对象,优先使用谁,没有则向上找。 间接通过方法访问成员变量,方法属于谁,则优先使用谁,没有则向上找。 重写了父类方法,就是50,不重写就是20。 public class Fu { int num = 20; public void main() { System.out.println("父类方法"); } public