C++继承的定义
两个类的继承关系在派生类中声明,派生类定义使用以下语法:
class DerivedClass: [ACCESS] BaseClass{
/…/
};
冒号(:)后的[ACCESS]是继承的最高权限级别符,可以是以下三个值(存取权限级别)的其中之一:
public,公共权限,三级(高)
protected,保护权限,二级
private,私有权限,一级(低)
由[ACCESS]的这三个值,从而引出了C++继承的三种方式:
1、公共继承,[ACCESS]是public
2、保护继承,[ACCESS]是protected
3、私有继承,[ACCESS]是private
首先明确一点:基类BaseClass的private成员,在派生类DerivedClass中是无法访问,即不能被继承。
最高权限级别符[ACCESS]
最高权限级别符[ACCESS]的意思是:
在派生类DerivedClass中,继承自基类BaseClass的成员的级别,高于[ACCESS]级别的都将被视为[ACCESS]级别;等于、低于[ACCESS]级别的,原样不动。基类BaseClass的private成员不被继承。
C++继承的三种方式详解如下:
一、公共继承,[ACCESS]是public
[ACCESS]为public时,基类BaseClass的成员级别在派生类DerivedClass中都不变,即public的继续是public、protected的继续是protected,private不被继承。
二、保护继承,[ACCESS]是protected
[ACCESS]为protected时,在派生类DerivedClass中,基类BaseClass的成员级别是public的修改为protected,原来是protected的继续是protected,private不被继承。
三、私有继承,[ACCESS]是private
[ACCESS]为private时,在派生类DerivedClass中,基类BaseClass的成员级别是public和protected的都修改为private,基类BaseClass的private成员不被继承。
实例源码
源码中注释内容有错误
两字时,表示此行会发生编译错误,将对应行前的注释删除,再编译即可重现错误
。
D:\YcjWork\CppTour>vim c2006.cpp
#include <iostream>
using namespace std;
/**
* 类继承的3种方式
*/
// 基类
class Base {
public:
int pub;
protected:
int prot;
private:
int priv;
};
// 公有继承
class PublicDerived : public Base {
public:
void test() {
pub = 1; // 正确,Base的public成员
prot = 1; // 正确,Base的protected成员继承为protected
// priv = 1; // 错误,Base的private成员不可访问
}
};
// 保护继承
class ProtectedDerived : protected Base {
public:
void test() {
pub = 1; // 正确,Base的public成员变为protected
prot = 1; // 正确,Base的protected成员保持为protected
// priv = 1; // 错误,Base的private成员不可访问
}
};
// 私有继承
class PrivateDerived : private Base {
public:
void test() {
pub = 1; // 正确,Base的public成员变为private
prot = 1; // 正确,Base的protected成员变为private
// priv = 1; // 错误,Base的private成员仍不可访问
}
};
int main() {
PublicDerived pub_derived;
PrivateDerived priv_derived;
ProtectedDerived prot_derived;
// 测试基类的访问权限
pub_derived.pub = 2; // 正确,PublicDerived的public成员
// prot_derived.pub = 1; // 错误,ProtectedDerived的protected基类成员不可访问
// priv_derived.pub = 1; // 错误,PrivateDerived的private基类成员不可访问
cout << "pub_derived.pub: " << pub_derived.pub << endl;
//cout << "prot_derived.pub: " << prot_derived.pub << endl; // 错误,ProtectedDerived的protected基类成员不可访问
//cout << "priv_derived.pub: " << priv_derived.pub << endl; // 错误,PrivateDerived的private基类成员不可访问
return 0;
}
编译运行
D:\YcjWork\CppTour>gpp c2006
D:\YcjWork\CppTour>g++ c2006.cpp -o c2006.exe
D:\YcjWork\CppTour>c2006
pub_derived.pub: 2
D:\YcjWork\CppTour>
运行截屏
(全文完)