目录
什么是继承?
基本语法
继承的类型
公有继承(public inheritance):
保护继承(protected inheritance):
私有继承(private inheritance):
继承中的构造函数和析构函数
多重继承
虚函数与多态
继承是 C++ 中一种机制,允许一个类(称为派生类或子类)从另一个类(称为基类或父类)继承属性和方法。通过继承,子类可以重用父类的代码,扩展或修改其功能,从而提高代码的可重用性和组织性。
在 C++ 中,继承通过在类定义时使用冒号 : 来实现。下面是一个简单的例子:
#include
using namespace std;
// 基类
class Animal {
public:
void eat() {
cout << "This animal eats food." << endl;
}
};
// 派生类
class Dog : public Animal {
public:
void bark() {
cout << "The dog barks!" << endl;
}
};
int main() {
Dog myDog;
myDog.eat(); // 调用基类的函数
myDog.bark(); // 调用派生类的函数
return 0;
}
输出:
This animal eats food.
The dog barks!
在这个例子中,Dog 类从 Animal 类继承,public 表示继承的访问权限(稍后会详细说明)。
C++ 支持以下几种继承类型,根据访问修饰符的不同而变化:
基类的 public 成员在派生类中仍是 public。
基类的 protected 成员在派生类中仍是 protected。
基类的 private 成员不可直接访问,但可以通过基类的公共接口间接访问。
基类的 public 和 protected 成员在派生类中变成 protected。
基类的 private 成员仍不可直接访问。
基类的 public 和 protected 成员在派生类中变成 private。
基类的 private 成员仍不可直接访问。
示例:
class Base {
public:
int publicVar = 1;
protected:
int protectedVar = 2;
private:
int privateVar = 3;
};
class Derived : public Base {
public:
void show() {
cout << publicVar << " " << protectedVar << endl; // privateVar不可访问
}
};
构造函数:基类的构造函数不会被派生类继承,但派生类的构造函数会自动调用基类的默认构造函数。如果基类没有默认构造函数,派生类需要显式调用基类的构造函数。
析构函数:析构函数不会被继承,但基类的析构函数会在派生类对象销毁时自动调用。为了避免内存泄漏,基类的析构函数通常应声明为 virtual。
示例:
class Base {
public:
Base() { cout << "Base constructor" << endl; }
virtual ~Base() { cout << "Base destructor" << endl; }
};
class Derived : public Base {
public:
Derived() { cout << "Derived constructor" << endl; }
~Derived() { cout << "Derived destructor" << endl; }
};
int main() {
Derived d;
return 0;
}
输出:
Base constructor
Derived constructor
Derived destructor
Base destructor
C++ 支持一个类从多个基类继承,这称为多重继承。语法如下:
class A {
public:
void funcA() { cout << "Function A" << endl; }
};
class B {
public:
void funcB() { cout << "Function B" << endl; }
};
class C : public A, public B {
};
int main() {
C obj;
obj.funcA(); // 调用 A 的函数
obj.funcB(); // 调用 B 的函数
return 0;
}
注意:多重继承可能导致“菱形问题”(Diamond Problem),即多个基类的共同基类被重复继承。解决方法是使用虚继承(virtual inheritance)。
继承的一个重要用途是实现多态。多态通过虚函数(virtual 关键字)实现,允许派生类重写基类的函数。
示例:
class Animal {
public:
virtual void sound() {
cout << "Some generic animal sound" << endl;
}
};
class Cat : public Animal {
public:
void sound() override {
cout << "Meow" << endl;
}
};
int main() {
Animal* ptr = new Cat();
ptr->sound(); // 输出 "Meow"
delete ptr;
return 0;
}
这里,virtual 确保调用的是实际对象的函数,而不是指针类型的函数。