子类继承父类后重载protected方法提升访问权限为public

本文讨论了Java中子类方法权限可以由protected提升为public的设计原理,通过实例解释了这一特性的合理性及其应用场景。

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

今天不小心继承一个类型的时候把其中的一个protected的方法写成了public,开始的时候没有发现,后来突然想起来这个方法应该是不提供给访问者的,那么检查竟然发现java编译器允许了这样的行为。
想一想,这样的设计还算蛮合理的。

设想有下面的情况:
某汽车公司有一款新车上市,但该公司规定这款车必须由公司内部人员驾驶,那么也就是这样

public class NewCar{

	protected void drive() {
	// drive the car
	}
}

 不过你说我买来一辆车总不能让这汽车公司的人来为我开车吧,所以这车的驾驶功能应该对我开放了才行,当然,只有属于我的车我才可以这样做,所以

class MyNewCar extends NewCar {

	@Override
	public void drive() {
	// do my own drive
	}

}

 这样,我自己的车就可以让任何人来驾驶了,包括借给哥们,或者送给女朋友(她们可能更希望你开车带她去兜风)

NewCar car = new NewCar();
car.drive();// no no no 这车可不是我的,不能随便开的
MyNewCar myCar = new MyNewCar();
myCar.drive();// ok 随便开,别超速哦~
 所以呢,java设计这个可以提高权限的做法就是为了让子类可以自己去决定它的方法是否可以开放给调用者。

当然了,你如果把原本父类public的方法给protected了,那么很抱歉,编译不通过的。原因显而易见,比如:

NewCar car = new MyNewCar();
car.drive();// 这这这,这车是我的啊,怎么还不让我开?对不起,你有证据么 -_-#
 OK 就说这么多了~
### C++ 中子类继承父类方法的方式 在 C++ 中,子类通过继承机制获得父类方法。具体来说,在定义子类时指定其基类(即父类),并可以选择不同的访问控制修饰符(public, protected 或 private),这决定了哪些成员可以从外部或派生类中被访问。 对于构造函数而言,当创建一个子类的对象时,默认情况下会先调用合适的父类构造函数来进行初始化工作[^1]。如果希望显式地调用特定版本的父类构造函数,则可以在子类构造函数中的初始化列表部分完成这一操作: ```cpp class Base { public: Base(int value) : m_value(value) {} private: int m_value; }; class Derived : public Base { public: // 显式调用Base类带参数的构造函数 Derived(int baseValue, double derivedData) : Base(baseValue), m_derivedData(derivedData) {} private: double m_derivedData; }; ``` 除了构造函数外,其他普通成员函数可以直接由子类继承而来,并且可以根据需求重载这些函数以提供更具体的实现逻辑。需要注意的是,只有非私有的成员才能被成功继承;而`private`级别的成员仅限于当前类内部使用,不会传递给任何派生类[^2]。 为了展示这一点,下面给出一段简单的例子说明如何在一个子类中覆盖来自父类的一个虚函数: ```cpp #include <iostream> using namespace std; // 定义一个带有纯虚函数的基础类 class Animal { public: virtual void speak() const = 0; // 纯虚函数使得Animal成为抽象类 ~Animal() {}; // 虚析构函数确保安全删除多态对象 }; // Dog 类继承自 Animal 并实现了 speak 函数 class Dog : public Animal { public: void speak() const override { cout << "Woof!" << endl; } }; int main(){ Dog myDog; myDog.speak(); // 输出 Woof! } ``` 在这个案例里,`speak()` 是 `Animal` 的一个接口声明,它强制所有实际类型的动物都要有自己的发声行为。因此,`Dog` 实现了自己的版本来响应这个请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值