父类、子类与公有继承

本文通过C++代码示例介绍了父类与子类的概念及其实现方式,展示了如何通过继承来实现代码重用,并详细解释了公有继承的特点及其对成员访问的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

父类与子类

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <string>


//C++ 通过继承关系 实现了代码的可重用性


class Human    //父类  共性
{
public:
	void eat(string food)
	{
		cout << "i am eatting" << food << endl;
	}

};


//子类 是在父类的基础上增加新的功能,体现的是个性
class Student :public Human  
{
public:
	void study(string course)
	{
		cout << "i am a student,i am learning " << course << endl;
	}
};


//父类的public 代表继承方式
//子类的public 代表访问权限
//:后面不写类型的话 默认为private

class Teacher :public Human
{
public:
	void tech(string course)
	{
		cout << "i am teacher,i am teaching " << course << endl;
	}
};



int _tmain(int argc, _TCHAR* argv[])
{
	Student s;
	s.study("C++");
	s.eat("佛跳墙");

	Teacher t;
	t.tech("java");
	t.eat("咸菜");

	return 0;
}

公有继承

公有继承中,子类除了构造器(包括拷贝构造)和析构器,会全盘接收父类。

#include "stdafx.h"
#include <iostream>
using namespace std;


#if 0

公有继承public
没有影响 子类的成员访问方式
影响了父类中的成员在子类的访问方式, 在子类内,还是子对象

father		public
pub			pub(public)
pro			pro(protected)
pri			inaccess(不可见)

说明:
1,全盘接收,除了构造器(包括拷贝构造)与析构器。基类有可能会造成派
生类的成员冗余,所以说基类是需设计的。

2,派生类有了自己的个性,使派生类有了意义

#endif


class Father
{
public:
	int x;
protected:
	int y;
private:
	int z;
};


class Son :public Father
{
public:
	int pub;
protected:
	int pro;
private:
	int pri;

};


int _tmain(int argc, _TCHAR* argv[])
{
	Son s;
	s.pub;

	return 0;
}


 

### 子类继承父类的方法和属性 在面向对象编程中,子类能够继承来自父类的属性和方法。这一特性使得代码复用成为可能,并支持多态性的实现。 #### Java 中的继承行为 对于Java而言,当定义一个新的类作为另一个现有类的子类时,该新类自动获得其父类所有的公共(public)以及受保护(protected)成员(包括字段和方法)。值得注意的是,尽管子类确实包含了父类的所有成员,但直接访问权限仅限于非私有(private)成员[^2]。因此,在编写代码时需要注意区分不同访问修饰符的影响范围: - **公有成员**:可以在任何地方被访问; - **受保护成员**:在同一包内或由子类访问; - **默认成员**:只在同一包内的类间可见; - **私有成员**:完全局限于声明它们的那个类内部。 即使子类无法直接操作父类中的`private`成员,仍然可以通过调用父类提供的公开接口间接获取这些数据项的信息或对其进行修改。此外,每当创建一个具体的子类实例时,实际上也会初始化一份对应的父类部分副本,这意味着每个子类对象都隐含着完整的父类结构。 ```java class Parent { public String pubField; protected int protField; private double privField; public void showPublic() { /* ... */ } } class Child extends Parent { @Override public void showPublic() { super.showPublic(); // 可以显式地调用父类版本的方法 } // 尝试直接访问privField将会导致编译错误 } ``` #### Python 中处理私有成员的方式 不同于Java严格的访问控制机制,Python采用了一种更为灵活的做法——名称改写(name mangling),用于模拟所谓的“私有化”。具体来说就是在类定义体内如果遇到形如`__name`这样的标识符,则会被解释器转换成类似于`_ClassName__name`的形式,从而达到一定程度上的隐藏效果[^5]。不过这并不意味着绝对的安全屏障,因为开发者依然有机会绕过这种简单的伪装手段。 ```python class Base: def __init__(self): self.public_attr = 'public' self._protected_attr = 'protected' self.__private_attr = 'private' def get_private(self): return self.__private_attr class Derived(Base): pass derived_instance = Derived() print(derived_instance.public_attr) # 输出: public print(derived_instance._protected_attr) # 输出: protected try: print(derived_instance.__private_attr) except AttributeError as e: print(e) # 抛出异常, 表明尝试访问不存在的属性 finally: print(derived_instance.get_private())# 成功输出: private ``` #### JavaScript 继承模式下的挑战 JavaScript作为一种基于原型的语言,默认情况下并没有提供像传统静态类型语言那样清晰直观的类层次体系。为了弥补这一点并更好地模仿经典OOP概念,ES6引入了正式的`class`语法糖衣,简化了许多常见的编码任务。然而即便如此,由于缺乏内置的支持措施来阻止对所谓“私有”组件的操作,程序员往往不得不依赖闭包或者其他技巧来构建相对封闭的数据封装环境[^3]。 ```javascript function SuperClass(){ this.sharedProperty = "shared"; function hiddenMethod(){/*...*/} // 函数作用域限定 Object.defineProperty(this,'secret',{ value:"hidden", writable:false, enumerable:false, configurable:true }); } SuperClass.prototype.commonFunc=function (){console.log('common')}; const subInstance=new (class SubClass extends SuperClass{ })(); // 测试可访问性 subInstance.sharedProperty; // 正常工作 subInstance.secret; // 不显示也不报错 subInstance.hiddenMethod(); // ReferenceError: Cannot access... subInstance.commonFunc(); // 能够正常执行 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值