在C++中,public继承和protected继承是两种不同的继承方式,它们在成员访问权限和继承行为上有显著的区别。以下将详细对比这两种继承方式,帮助你更好地理解它们的差异。
一、public继承
public继承是最常用的继承方式,它允许派生类继承基类的公共成员和保护成员,并保持它们原有的访问权限。基类的私有成员在派生类中仍然无法直接访问,但可以通过基类的公共或保护成员函数间接访问。
(一)成员访问权限
基类的公共成员:在派生类中仍然是公共的,可以通过派生类的对象直接访问。
基类的保护成员:在派生类中仍然是保护的,可以在派生类的成员函数中访问,但不能通过派生类的对象直接访问。
基类的私有成员:在派生类中无法直接访问,但可以通过基类的公共或保护成员函数间接访问。
(二)示例代码
cpp
复制
class Base {
public:

void publicFunction() {
    std::cout << "Base publicFunction" << std::endl;
}

protected:

void protectedFunction() {
    std::cout << "Base protectedFunction" << std::endl;
}

private:

void privateFunction() {
    std::cout << "Base privateFunction" << std::endl;
}

};

class Derived : public Base {
public:

void derivedFunction() {
    publicFunction(); // 可以访问基类的公共成员
    protectedFunction(); // 可以访问基类的保护成员
    // privateFunction(); // 无法访问基类的私有成员
}

};

int main() {

Derived obj;
obj.publicFunction(); // 可以访问基类的公共成员
// obj.protectedFunction(); // 无法直接访问基类的保护成员
obj.derivedFunction(); // 通过派生类的成员函数访问基类的保护成员
return 0;

}
(三)输出
复制
Base publicFunction
Base protectedFunction
二、protected继承
protected继承与public继承类似,但在这种继承方式下,基类的公共成员和保护成员在派生类中都变为保护成员。基类的私有成员仍然无法直接访问。
(一)成员访问权限
基类的公共成员:在派生类中变为保护成员,不能通过派生类的对象直接访问,但可以在派生类的成员函数中访问。
基类的保护成员:在派生类中仍然是保护成员,可以在派生类的成员函数中访问,但不能通过派生类的对象直接访问。
基类的私有成员:在派生类中无法直接访问,但可以通过基类的公共或保护成员函数间接访问。
(二)示例代码
cpp
复制
class Base {
public:

void publicFunction() {
    std::cout << "Base publicFunction" << std::endl;
}

protected:

void protectedFunction() {
    std::cout << "Base protectedFunction" << std::endl;
}

private:

void privateFunction() {
    std::cout << "Base privateFunction" << std::endl;
}

};

class Derived : protected Base {
public:

void derivedFunction() {
    publicFunction(); // 可以访问基类的公共成员,但它是保护的
    protectedFunction(); // 可以访问基类的保护成员
    // privateFunction(); // 无法访问基类的私有成员
}

};

int main() {

Derived obj;
// obj.publicFunction(); // 无法直接访问基类的公共成员
obj.derivedFunction(); // 通过派生类的成员函数访问基类的公共成员
return 0;

}
(三)输出
复制
Base publicFunction
Base protectedFunction
三、public继承与protected继承的主要区别
(一)成员访问权限
public继承:
基类的公共成员在派生类中仍然是公共的。
基类的保护成员在派生类中仍然是保护的。
protected继承:
基类的公共成员在派生类中变为保护成员。
基类的保护成员在派生类中仍然是保护成员。
(二)外部访问
public继承:
派生类的对象可以直接访问基类的公共成员。
派生类的对象不能直接访问基类的保护成员。
protected继承:
派生类的对象不能直接访问基类的公共成员。
派生类的对象不能直接访问基类的保护成员。
(三)适用场景
public继承:
适用于“是一个”(is-a)关系,例如“Dog 是一种 Animal”。在这种情况下,派生类对象可以被视为基类对象,基类的公共接口可以被派生类继承和扩展。
protected继承:
较少使用,适用于“受保护的实现”关系,例如“Derived 使用了 Base 的实现,但不希望外部代码直接访问基类的接口”。
四、总结
public继承和protected继承的主要区别在于成员访问权限和外部访问行为:
public继承:基类的公共成员在派生类中仍然是公共的,可以通过派生类的对象直接访问。
protected继承:基类的公共成员在派生类中变为保护成员,不能通过派生类的对象直接访问。
选择哪种继承方式取决于具体的设计需求。public继承是最常用的,适用于“是一个”关系;而protected继承较少使用,适用于“受保护的实现”关系。


愤怒的小马驹
1 声望0 粉丝

引用和评论

0 条评论