C++中的继承是一种面向对象的程序设计方式,它允许我们去定义一个新的类(称为子类或派生类),该类可以继承另一个已经存在的类(称为父类或基类)的所有成员变量和成员函数,同时也可以在其自身内部添加新的成员变量和成员函数。
继承的类型
在C++中,继承主要有以下几种类型:
- 公有继承(public inheritance):当子类继承自父类时,父类中的公有成员和保护成员都可以被子类访问(即子类可以通过自身或父类的指针或引用访问这些成员),而私有成员在子类中是不可访问的。
- 保护继承(protected inheritance):与公有继承类似,不同的是,父类中的公有成员和保护成员都只能被子类本身或子类的派生类访问,但是子类的对象不能访问这些成员。
- 私有继承(private inheritance):当子类继承自父类时,父类中的公有成员和保护成员都只能被子类自身和其子类的成员函数访问,而子类的对象不能访问这些成员。
继承的语法
在C++中,我们使用冒号(:)来实现继承。在子类名称后面跟一个冒号,接着是访问基类成员的方式(公有、保护、私有),最后是要继承的基类名称。例如:
class Parent {
public:
int public_member1;
protected:
int protected_member1;
private:
int private_member1;
};
class Child : public Parent {
public:
int public_member2;
void Child_func() {}
};
在上面的代码中,类Child继承自类Parent。类Child公有地继承了类Parent中的所有成员。这意味着,类Child中可以访问类Parent中的公有成员和保护成员,而类Parent中的私有成员对于类Child来说是不可见的。
继承的使用
在实际应用中,我们通常使用继承来实现代码的重用和扩展。例如,我们可以定义一个Animal类作为基类,然后定义一个Dog类和一个Cat类作为派生类。这两个派生类可以继承Animal类的一些特性,比如体型、颜色等,同时也可以在自己的类中添加一些新的特性,比如犬吠、猫叫等。
下面的示例代码展示了如何使用继承来实现这样的需求:
#include <iostream>
using namespace std;
class Animal {
protected:
int weight;
string color;
public:
Animal(int w, string c) : weight(w), color(c) {}
void move() {
cout << "Animal is moving..." << endl;
}
};
class Dog : public Animal {
public:
string bark;
Dog(int w, string c, string b) : Animal(w, c), bark(b) {}
void move() {
cout << "Dog is moving..." << endl;
Animal::move(); // 调用基类的同名函数
}
};
class Cat : public Animal {
public:
string mew;
Cat(int w, string c, string m) : Animal(w, c), mew(m) {}
void move() {
cout << "Cat is moving..." << endl;
}
};
int main() {
Dog mydog(20, "brown", "wangwang");
Cat mycat(10, "white", "miaomiao");
mydog.move();
mycat.move();
cout << "Dog's color: " << mydog.color << ", Dog's weight: " << mydog.weight << ", Dog's bark: " << mydog.bark << endl;
cout << "Cat's color: " << mycat.color << ", Cat's weight: " << mycat.weight << ", Cat's mew: " << mycat.mew << endl;
return 0;
}
上述代码中,基类Animal包含了一些基本属性(重量和颜色),并定义了一个公有函数move。类Dog和类Cat都继承自Animal类,并添加自己的属性(犬吠和猫叫)。类Dog中重载了move函数,并在其中通过调用Animal::move()来调用基类的同名函数。类Cat中也定义了自己的move函数,但并没有重载基类的函数。
在main函数中,我们创建了一个Dog对象mydog和一个Cat对象mycat,并调用了它们的move函数。我们也访问了这两个对象的各自属性,包括颜色、重量、犬吠和猫叫。
通过以上示例,我们可以看到继承能够有效地提高代码复用,同时还可以为派生类增加新的特性。在实际应用中,我们可以基于此来设计复杂的类体系,以满足不同的需求。