//: c07:Frog.java
// Cleanup and inheritance.
import com.bruceeckel.simpletest.*;
class Characteristic {
private String s;
Characteristic(String s) {
this.s = s;
System.out.println("Creating Characteristic " + s);
}
protected void dispose() {
System.out.println("finalizing Characteristic " + s);
}
}
class Description {
private String s;
Description(String s) {
this.s = s;
System.out.println("Creating Description " + s);
}
protected void dispose() {
System.out.println("finalizing Description " + s);
}
}
class LivingCreature {
private Characteristic p = new Characteristic("is alive");
private Description t = new Description("Basic Living Creature");
LivingCreature() {
System.out.println("LivingCreature()");
}
protected void dispose() {
System.out.println("LivingCreature dispose");
t.dispose();
p.dispose();
}
}
class Animal extends LivingCreature {
private Characteristic p = new Characteristic("has heart");
private Description t = new Description("Animal not Vegetable");
Animal() {
System.out.println("Animal()");
}
protected void dispose() {
System.out.println("Animal dispose");
t.dispose();
p.dispose();
super.dispose();
}
}
class Amphibian extends Animal {
private Characteristic p = new Characteristic("can live in water");
private Description t = new Description("Both water and land");
Amphibian() {
System.out.println("Amphibian()");
}
protected void dispose() {
System.out.println("Amphibian dispose");
t.dispose();
p.dispose();
super.dispose();
}
}
public class Frog extends Amphibian {
private static Test monitor = new Test();
private Characteristic p = new Characteristic("Croaks");
private Description t = new Description("Eats Bugs");
public Frog() {
System.out.println("Frog()");
}
protected void dispose() {
System.out.println("Frog dispose");
t.dispose();
p.dispose();
super.dispose();
}
public static void main(String[] args) {
Frog frog = new Frog();
System.out.println("Bye!");
frog.dispose();
monitor.expect(new String[] {
"Creating Characteristic is alive",
"Creating Description Basic Living Creature",
"LivingCreature()",
"Creating Characteristic has heart",
"Creating Description Animal not Vegetable",
"Animal()",
"Creating Characteristic can live in water",
"Creating Description Both water and land",
"Amphibian()",
"Creating Characteristic Croaks",
"Creating Description Eats Bugs",
"Frog()",
"Bye!",
"Frog dispose",
"finalizing Description Eats Bugs",
"finalizing Characteristic Croaks",
"Amphibian dispose",
"finalizing Description Both water and land",
"finalizing Characteristic can live in water",
"Animal dispose",
"finalizing Description Animal not Vegetable",
"finalizing Characteristic has heart",
"LivingCreature dispose",
"finalizing Description Basic Living Creature",
"finalizing Characteristic is alive" });
}
} // /:~
分享到:
相关推荐
c++继承与派生习题答案 c++继承是面向对象编程(OOP)的一个基本概念,它允许一个类继承另一个类的成员变量和成员函数,从而实现代码的重用和继承。以下是c++继承与派生习题的答案: 1.概念填空题 1.1 三种派生...
类多重继承的模糊性的消除,类多重继承的模糊性的消除
在Java编程语言中,继承与面向接口编程是两种核心概念,它们构成了面向对象编程(OOP)的基础。然而,在实际开发过程中,过度依赖继承或不恰当地使用接口可能会导致代码结构复杂、维护困难等问题。本文将深入探讨...
类的继承与派生是面向对象编程中的核心概念,它允许我们创建新的类,这些新类基于现有的类(称为基类或父类),并可以扩展或修改基类的功能。在这个实验中,我们将深入理解这个过程,并通过实际代码来演示继承和派生...
接下来,我们需要处理清除按钮的显示与隐藏逻辑。当EditText有内容时,我们显示清除按钮;反之,如果输入框为空,则隐藏它。我们可以在`onTextChanged`回调中实现这一功能: ```java @Override public void ...
// 清除临时变量,避免引用循环 delete B.temp; ``` ### 3. 组合继承 组合继承结合了原型链继承和构造函数继承的优点,既可以向父类传递初始化参数,又避免了属性共享的问题。 **示例代码解析**: ```javascript ...
虚拟继承确保所有通过虚拟基类派生的类共享同一份基类的数据,从而消除二义性。 在钻石继承的场景中,如果B和C都虚拟地继承自A,即`class B : virtual public A`和`class C : virtual public A`,那么类D在继承B和C...
当考虑多重继承时,应权衡其带来的复杂性与代码的可读性和可维护性。有时候,组合(Composition)比继承(Inheritance)更能提供灵活和可扩展的解决方案。 总的来说,多重继承是C++中一把双刃剑,既可以增强代码的...
虚继承确保子类只有一个特定基类的实例,从而消除二义性。 在Qt中,C++的继承机制被广泛用于构建复杂的用户界面和应用程序框架。Qt库提供了一套丰富的基类,如`QObject`,它是所有Qt对象的基类,包含了事件处理、...
第三个程序涉及到多继承的问题,可能出现编译错误,解决办法通常包括使用虚基类来消除二义性。 最后,设计一个大学人员管理程序,可以采用以下结构: - 定义一个虚基类Person,包含姓名、年龄和性别的属性。 - 从...
这样就消除了多继承中的二义性,确保了代码的一致性和可预测性。 下面通过一个简单的例子来阐述虚拟继承: 假设我们有两个基类`Base1`和`Base2`,它们都包含一个名为`data`的成员变量,然后有一个类`Derived`继承...
在阅读《C++多继承与虚基类.docx》文档时,你可能会深入了解到虚基类的实现细节、语法以及它在实际项目中的应用案例。理解并掌握这一概念对于编写复杂的C++程序,特别是涉及多继承的场景,是至关重要的。通过文档的...
类多重继承的模糊性的消除2,类多重继承的模糊性的消除2
通过阅读《C++通过虚继承来消灭菱形结构消除二义性》、《C++因为多继承而产生了菱形结构》、《C++虚继承的意义和使用》、《C++中虚继承的作用及底层实现原理》以及《C++对象模型:单继承,多继承,虚继承》等相关...
为了解决这种二义性,可以使用作用域解析运算符`::`来明确指定使用哪个基类的成员,或者在派生类中重新定义这些成员以消除二义性。 **虚继承** 主要用于解决多重继承中的一个特定问题,即**菱形继承**。菱形继承是...
3. **访问修饰符与继承**: - 基类的成员在派生类中的访问权限会受到继承方式的影响: - **私有继承(private inheritance)**:基类的public和protected成员在派生类中变为private。 - **保护继承(protected ...
在这个例子中,`BaseClass1`被声明为`BaseClass2`的虚基类,因此`DerivedClass`中只有一个`BaseClass1`的实例,消除了菱形问题。 **访问控制与成员重载:** 在多重继承中,派生类可以访问所有基类的公有和保护成员...
使用虚继承可以确保所有派生类共享同一基类的实例,从而消除钻石问题。声明基类为虚基类的语法如下: ```cpp class Derived : virtual public Base { // ... }; ``` 总的来说,多继承提供了更大的灵活性,但...
4. **消除不必要的成员**:类的设计应简洁明了,不必要的成员会增加复杂性和潜在的错误来源。 5. **避免动词命名类**:类名通常应反映其代表的实体或概念,而不是动作。动词命名的类可能暗示了它是一个操作,这可能...
在基类前加上关键字`virtual`,如`class Derived : virtual public Base1, virtual public Base2 {}`,这样所有通过多重继承路径到达的虚基类实例都将共享同一份内存,从而消除二义性。 在实际工作中,信息屏蔽...