CPP的继承和多态
在C++中,继承(Inheritance)和多态(Polymorphism)是面向对象编程(OOP)的两个核心概念,它们允许我们创建更灵活和可维护的代码结构。
继承(Inheritance)
继承是一种机制,允许一个类(派生类或子类)继承另一个类(基类或父类)的属性和方法。通过继承,我们可以创建一个新的类,这个新类包含现有类的所有特性,并可以添加或覆盖新的特性。
在C++中,使用冒号(:)操作符来表示继承关系。
cpp复制代码
|
class Base { |
|
public: |
|
void show() { |
|
std::cout << "Base class" << std::endl; |
|
} |
|
}; |
|
|
|
class Derived : public Base { // Derived继承自Base |
|
public: |
|
void anotherShow() { |
|
std::cout << "Derived class" << std::endl; |
|
} |
|
}; |
在这个例子中,Derived类继承了Base类。因此,Derived类的对象可以调用show()方法,该方法是在Base类中定义的。
继承有三种类型:公有继承(public)、私有继承(private)和保护继承(protected)。它们决定了基类成员在派生类中的访问级别。
多态(Polymorphism)
多态允许我们使用基类的指针或引用来操作派生类的对象,同时调用它们各自实现的同名方法。这提供了一种机制,使我们能够以统一的方式处理不同类型的对象。
多态主要通过虚函数(virtual functions)和纯虚函数(pure virtual functions)来实现。
虚函数(Virtual Functions)
在基类中,将成员函数声明为virtual,允许派生类重写该函数。当使用基类的指针或引用来调用虚函数时,会根据实际对象的类型来调用相应的函数实现。
cpp复制代码
|
class Base { |
|
public: |
|
virtual void show() { // 虚函数 |
|
std::cout << "Base class" << std::endl; |
|
} |
|
}; |
|
|
|
class Derived : public Base { |
|
public: |
|
void show() override { // 重写虚函数 |
|
std::cout << "Derived class" << std::endl; |
|
} |
|
}; |
|
|
|
int main() { |
|
Base* basePtr; |
|
Derived derivedObj; |
|
basePtr = &derivedObj; // 基类指针指向派生类对象 |
|
basePtr->show(); // 输出 "Derived class",调用Derived的show() |
|
return 0; |
|
} |
在这个例子中,show()函数在Base类中被声明为虚函数,并在Derived类中被重写。当通过Base类的指针basePtr调用show()函数时,实际调用的是Derived类的show()函数实现。
纯虚函数(Pure Virtual Functions)
纯虚函数是在基类中声明但不定义,且需要在派生类中重写的虚函数。包含纯虚函数的类被称为抽象类(abstract class),它不能被实例化。纯虚函数使用= 0来标记。
cpp复制代码
|
class AbstractBase { |
|
public: |
|
virtual void pureVirtualFunction() = 0; // 纯虚函数 |
|
}; |
|
|
|
class Derived : public AbstractBase { |
|
public: |
|
void pureVirtualFunction() override { // 在派生类中重写纯虚函数 |
|
std::cout << "Derived class pure virtual function" << std::endl; |
|
} |
|
}; |
在这个例子中,AbstractBase类包含一个纯虚函数pureVirtualFunction(),因此它不能被实例化。Derived类继承了AbstractBase并提供了pureVirtualFunction()的实现。
多态允许我们编写更加通用和灵活的代码,因为它允许我们在运行时确定要执行的具体操作,而不是在编译时。这使得程序能够更好地适应不同的对象和情境。