今天进行了新的学习关于c++继承的知识。
目录
1.继承
基类and派生类
访问控制和继承
单继承
多继承
2.同名隐藏
1.继承
在C++中,继承是一种面向对象编程的重要特性,用于构建类之间的层次关系。通过继承,一个类可以从另一个类继承其属性(数据成员)和方法(成员函数),从而实现代码重用和代码组织的目的。
当创建一个类时,不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。
继承代表了 is a(是一个的) 关系。例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物。
代码演示:
// 基类 class Animal {// eat() 函数// sleep() 函数 }; //派生类 class Dog : public Animal {// bark() 函数 };
基类and派生类
一个类可以派生多个类,这意味着,它可以从多个基类继承数据和函数。定义一个派生类,我们使用一个类派生列表来指定基类。
访问控制和继承
一个派生类继承了所有的基类方法,但下列情况除外:
基类的构造函数、析构函数和拷贝构造函数。
基类的重载运算符。
基类的友元函数。
单继承
单继承是指一个派生类(子类)只能继承自一个基类(父类)。C++支持单继承,一个派生类只能有一个直接的基类。
// 基类 class Shape { public:void draw() {// 绘制图形} }; // 派生类 class Circle : public Shape { public:void draw() {// 绘制圆形} }; 在上述示例中,Circle类从Shape类继承了draw()方法,并重写了该方法以实现绘制圆形的行为。
多继承
多继承是指一个派生类可以从多个基类继承属性和方法。C++支持多继承,一个派生类可以有多个直接的基类,用逗号分隔。
// 基类1 class A { public:void methodA() {// 方法A} }; // 基类2 class B { public:void methodB() {// 方法B} }; // 派生类继承自两个基类 class C : public A, public B { public:void methodC() {// 方法C} }; 在上述示例中,C类从A类和B类继承了它们的方法,并且可以在派生类中访问methodA()、methodB()和methodC()。
2.同名隐藏
同名隐藏(Name Hiding)是一个在 C++ 继承中需要注意的现象。当派生类中的成员与基类中的成员同名时,派生类的成员会隐藏基类中同名的成员,导致在特定的情况下无法访问基类的同名成员。这种现象发生在多级继承或多重继承中,尤其在使用指针或引用时容易出现。
#include <iostream> class Base { public:int x;void display() {std::cout << "Base: " << x << std::endl;} }; class Derived : public Base { public:int x;void display() {std::cout << "Derived: " << x << std::endl;} }; int main() {Derived derivedObj;derivedObj.x = 10;derivedObj.display(); // 输出 "Derived: 10"derivedObj.Base::x = 5; // 使用作用域解析运算符访问基类的成员derivedObj.Base::display(); // 输出 "Base: 5"return 0; }
在上述示例中,Derived类继承自Base类,并且两个类都有一个同名成员x。在Derived类中,成员x会隐藏基类Base的成员x。当我们通过派生类对象访问x时,默认情况下会访问派生类中的成员x,而无法直接访问基类中的成员x。
为了访问被隐藏的基类成员,我们可以使用作用域解析运算符 :: 来指定所属的类,如示例中的 derivedObj.Base::x 和 derivedObj.Base::display()。这样可以明确地指定使用基类中的成员,而不是派生类中的成员。