c++类的继承

基本概念    

    类的继承是一种面向对象编程中的核心概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。在继承关系中,子类可以访问父类的所有非私有成员,并且可以添加新的成员或重写继承的方法。继承有助于代码重用和提高软件的可维护性。

        展示一个普通的继承

#include <iostream>
using namespace std;
class Animal {
public:
	float a_weight;
	int a_age;
	Animal() :a_weight(0), a_age(0) {}
	Animal(float weight, int age) :a_weight(weight), a_age(age) {}
	~Animal(){}
	
	float getWeight()const { return a_weight; }
	int getAge() const{ return a_age; }

	void setWeight(float weight) { a_weight = weight; }
	void setAge(float age) { a_age = age; }

	void show()const { cout << "-->a_weight  " << a_weight << endl << "-->a_age  " << a_age << endl; }
};

class Cat :public Animal {
public:
	string c_voice;
	Cat() :c_voice("喵喵") {}
	string getVoice()const { return c_voice; }
	void setVoice(string voice) { c_voice = voice; }
	void show()const {
		cout << "-->a_weight  " << a_weight << endl;
		cout << "-->a_age  " << a_age << endl;
		cout << "-->c_voice  " << c_voice << endl;
	}   
};
int main() {
	Cat c;
	c.setAge(20);
	c.setWeight(100.22);
	c.show();

	return 0;
}

继承方式


        类成员的访问权限由高到低依次为:public --> protected-->private,  public 成员在类外可以访问,private 成员只能在类的成员函数中访问。←
        如果不考虑继承关系,protected 成员和 private 成员一样,类外不能访问。但是,当存在继承关系protected 和 private 就不一样了。基类中的 protected 成员可以在派生类中访问,而基类中的private 成员不能在派生类中访问。
        继承方式有三种:public(公有的)、protected(受保护的)和private(私有的)。它是可选的,如果不写,那么默认为 private。不同的继承方式决定了在派生类中成员函数中访问基类成员的权限。

        文字不好理解我们看图片:

  • 类成员在派生类中的访问权限不得高于继承方式中指定的权限。例如,当继承方式为 protected 时,那么基类成员在派生类中的访问权限最高也为 protected,高于 protected 的会降级为 protected,但低于 protected 不会升级。再如,当继承方式为public时,那么基类成员在派生类中的访问权限将保持不变。“也就是说,继承方式中的 public、protected、private 是用来指明基类成员在派生类中的最高访问权限的。“
  • 不管继承方式如何,基类中的 private 成员在派生类中始终不能使用(不能在派生类的成员函数中访问或调用)。
  • 如果希望基类的成员能够被派生类继承并且毫无障碍地使用,那么这些成员只能声明为 public或 protected;只有那些不希望在派生类中使用的成员才声明为 private。
  • 如果希望基类的成员既不向外暴露(不能通过对象访问),还能在派生类中使用,那么只能声明为 protected。←
  • 由于 private 和 protected 继承方式会改变基类成员在派生类中的访问权限,导致继承关系复杂所以,在实际开发中,一般使用 public。
  • 在派生类中,可以通过基类的公有成员函数间接访问基类的私有成员如以下代码:
class A {
public:
	int a_public;
	void show() {
		cout << a_private << endl;
	}
private:
	int a_private;
protected:
	int a_protected;
};

class B :public A {
};

int main() {
	B b;
	b.show();
	return 0;
}

        在A中成员函数show被声明为public,可以访问private对象,也可以被继承,B继承了A的show方法,也可以对A的private成员进行访问。

  • 使用 using 关键字可以改变基类成员在派生类中的访问权限。注意:using 只能改变基类中 public和 protected 成员的访问权限,不能改变 private 成员的访问权限,因为基类中 private 成员在派生类中是不可见的,根本不能使用。
class B :public A {
private:
	using A::a_public;//把A的共有对象声明为私有对象
public:
	using A::a_protected;//把A的保护对象声明为公有的
};

  • 27
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值