OOP基础篇:揭秘C++中类的继承,掌握继承的奥秘
2023-12-06 05:10:15
C++中的继承:对象间的层级关系
在C++中,继承是一种强大的机制,它允许您利用现有类的特性来创建新类。继承能够帮助您重用代码,提高开发效率,并创建更具可扩展性和可维护性的软件系统。C++支持多种形式的继承,包括:
- 单继承: 一个类继承自一个父类。
- 多继承: 一个类继承自多个父类。
- 层次继承: 一个类继承自另一个类,而另一个类又继承自另一个类,如此依次下去。
- 菱形继承: 一个类继承自两个父类,而这两个父类又都继承自同一个类。
- 混合继承: 一个类继承自两个或多个父类,而这些父类之间没有直接的继承关系。
单继承:扩展父类功能
单继承是最简单的继承形式。它允许您从一个父类继承特性,并在此基础上扩展其功能。例如,您可以创建一个Animal
类,并从它派生出Dog
和Cat
类。Dog
和Cat
类将继承Animal
类中的属性和方法,但它们也可以拥有自己的特有属性和方法。
class Animal {
public:
void eat() {
cout << "Animal is eating" << endl;
}
};
class Dog : public Animal {
public:
void bark() {
cout << "Dog is barking" << endl;
}
};
class Cat : public Animal {
public:
void meow() {
cout << "Cat is meowing" << endl;
}
};
int main() {
Animal animal;
animal.eat();
Dog dog;
dog.eat(); // Inherited from Animal
dog.bark(); // Unique to Dog
Cat cat;
cat.eat(); // Inherited from Animal
cat.meow(); // Unique to Cat
return 0;
}
多继承:整合父类特性
多继承允许您从多个父类继承特性。这可以帮助您创建具有来自多个父类特性的类。例如,您可以创建一个Vehicle
类,并从它派生出Car
和Truck
类。Car
和Truck
类将继承Vehicle
类中的属性和方法,但它们也可以拥有自己的特有属性和方法。
class Vehicle {
public:
void drive() {
cout << "Vehicle is driving" << endl;
}
};
class Car : public Vehicle {
public:
void honk() {
cout << "Car is honking" << endl;
}
};
class Truck : public Vehicle {
public:
void haul() {
cout << "Truck is hauling" << endl;
}
};
int main() {
Vehicle vehicle;
vehicle.drive();
Car car;
car.drive(); // Inherited from Vehicle
car.honk(); // Unique to Car
Truck truck;
truck.drive(); // Inherited from Vehicle
truck.haul(); // Unique to Truck
return 0;
}
层次继承:构建对象族谱
层次继承允许您创建一个类的层级结构,其中每个类都从一个父类继承特性。这可以帮助您创建具有不同级别的特性的对象。例如,您可以创建一个Animal
类,并从它派生出Mammal
类,再从Mammal
类派生出Dog
和Cat
类。Dog
和Cat
类将继承Mammal
类和Animal
类中的属性和方法,但它们也可以拥有自己的特有属性和方法。
class Animal {
public:
void eat() {
cout << "Animal is eating" << endl;
}
};
class Mammal : public Animal {
public:
void giveBirth() {
cout << "Mammal is giving birth" << endl;
}
};
class Dog : public Mammal {
public:
void bark() {
cout << "Dog is barking" << endl;
}
};
class Cat : public Mammal {
public:
void meow() {
cout << "Cat is meowing" << endl;
}
};
int main() {
Animal animal;
animal.eat();
Mammal mammal;
mammal.eat(); // Inherited from Animal
mammal.giveBirth(); // Unique to Mammal
Dog dog;
dog.eat(); // Inherited from Animal
dog.giveBirth(); // Inherited from Mammal
dog.bark(); // Unique to Dog
Cat cat;
cat.eat(); // Inherited from Animal
cat.giveBirth(); // Inherited from Mammal
cat.meow(); // Unique to Cat
return 0;
}
菱形继承:处理重复继承
菱形继承是一种特殊的继承形式,其中一个类继承自两个父类,而这两个父类又都继承自同一个类。这可能导致重复的特性和方法,因为子类同时继承了两个父类中的相同特性和方法。菱形继承通常不推荐使用,因为它可能导致代码的复杂性和难以维护。
class A {
public:
void f() {
cout << "A::f()" << endl;
}
};
class B : public A {
public:
void g() {
cout << "B::g()" << endl;
}
};
class C : public A {
public:
void h() {
cout << "C::h()" << endl;
}
};
class D : public B, public C {
public:
void i() {
cout << "D::i()" << endl;
}
};
int main() {
D d;
d.f(); // Ambiguous, both A and C have f()
d.g(); // Unique to B
d.h(); // Unique to C
d.i(); // Unique to D
return 0;
}
混合继承:组合不同父类特性
混合继承是一种特殊的继承形式,其中一个类继承自两个或多个父类,而这些父类之间没有直接的继承关系。这允许您组合来自不同父类的特性,并创建具有独特功能的新类。混合继承通常用于创建具有不同接口或功能的类。
class A {
public:
void f() {
cout << "A::f()" << endl;
}
};
class B {
public:
void g() {
cout << "B::g()" << endl;
}
};
class C : public A, public B {
public:
void h() {
cout << "C::h()" << endl;
}
};
int main() {
C c;
c.f(); // Inherited from A
c.g(); // Inherited from B
c.h(); // Unique to C
return 0;
}