41.继承的方式
程序:
#pragma warning(disable:4996)
#define _CRT_SECURE_NO_WARNINGS 1
//2022年10月15日20:24:40
#include <iostream>
using namespace std;
class Father
{
public:
int a;
private:
int b;
protected:
int c;
};
class Son:public Father
{
public:
void func()
{
a;
//b;//err
c;
}
/*
公有继承:
1.类的公有属性成员,到子类还是公有(类内可以使用类外也可以使用)
2.父类的私有属性成员,到子类还是私有
3.父类的保护属性成员,到子类仍然是保护
*/
};
void test01()
{
Son s1;
s1.a;
//s1.b;//err
//s1.func;//err
}
//保护继承
class Son2:protected Father
{
public:
void func()
{
a;
//b;//err
c;
/*
保护继承:
1.父类的公有属性成员,到子类是保护
2.父类的私有属性成员,到子类还是私有
3.父类的保护属性成员,到子类还是保护
*/
}
};
void test02()
{
Son s2;
//s2.a;//err
//s2.b;//err
//s2.c;//err
}
//私有继承
class Son3:private Father
{
public:
void func()
{
a;
//b;//err
c;
/*
私有继承:
1.父类的公有属性成员,到子类是私有
2.父类的私有属性成员,到子类还是私有
3.父类的保护属性成员,到子类还是保护
*/
}
};
void test03()
{
Son s3;
s3.a;
//s3.b;//err
//s3.c;//err
}
int main()
{
test03();
system("pause");
return EXIT_SUCCESS;
}
1.继承方式
三种继承方式:
■ public : 公有继承
■private : 私有继承
■protected : 保护继承
从继承源上分:
●单继承:指每个派生类只直接继承了一个基类的特征
●多继承:指多个基类派生出一个派生类的继承关系,多继承的派生类直接继承了不止一个基类的特征
2.子类对从父类继承过来的成员的权限
1.公有继承
1.父类的公有属性成员,到子类还是公有
2.父类的保护属性成员,到子类还是保护
3.父类的私有属性成员,到子类不能访问
-
基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可直接访问。
-
派生类中的成员函数可以直接访问基类中的public和protecte成员,但不能直接访问基类的private成员。
-
通过派生类的对象访问基类继承的成员,只能访问public成员。
#include<iostream> using namespace std; class CFather { public: int m_testA{0}; protected: int m_testB{0}; private: int m_testC{0}; }; class CSon: public CFather { void test() { m_testA = 1; // 编译正确 :public 继承后,在内部或者外部都可以访问public成员 m_testB = 1; // 编译正确 :public 继承后,在内部可以访问protected成员 m_testC = 1; // 编译错误 :无论哪种继承,都无法访问private成员 } }; int main() { CSon _test; _test.m_testA = 2; // 编译正确 :public 继承后,在内部或者外部都可以访问public成员 _test.m_testB = 2; // 编译错误 :public 继承后,在外部无法访问protected成员 _test.m_testC = 2; // 编译错误 :无论哪种继承,都无法访问private成员 system("pause"); return 0; }
2.保护继承
1.父类的公有属性成员,到子类是保护
2.父类的保护属性成员,到子类还是保护
3.父类的私有属性成员,到子类不能访问
-
基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可直接访问。
-
派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。
-
通过派生类的对象不能直接访问从基类继承的任何成员。
#include<iostream> using namespace std; class CFather { public: int m_testA{0}; protected: int m_testB{0}; private: int m_testC{0}; }; class CSon: protected CFather { void test() { m_testA = 1; // 编译正确 :protected 继承后,在内部可以访问public成员 m_testB = 1; // 编译正确 :protected 继承后,在内部可以访问protected成员 m_testC = 1; // 编译错误 :无论哪种继承,都无法访问private成员 } }; int main() { CSon _test; _test.m_testA = 2; // 编译错误 :protected 继承后,在外部无法访问public成员 _test.m_testB = 2; // 编译错误 :protected 继承后,在外部无法访问protected成员 _test.m_testC = 2; // 编译错误 :无论哪种继承,都无法访问private成员 system("pause"); return 0; }
3.私有继承
1.父类的公有属性成员,到子类还是私有
2.父类的保护属性成员,到子类还是私有
3.父类的私有属性成员,到子类不能访问
-
基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可直接访问。
-
派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。
-
通过派生类的对象不能直接访问从基类继承的任何成员。
#include<iostream> using namespace std; class CFather { public: int m_testA{0}; protected: int m_testB{0}; private: int m_testC{0}; }; class CSon: private CFather { void test() { m_testA = 1; // 编译正确 :private 继承后,在内部可以访问public成员 m_testB = 1; // 编译正确 :private 继承后,在内部可以访问protected成员 m_testC = 1; // 编译错误 :无论哪种继承,都无法访问private成员 } }; int main() { CSon _test; _test.m_testA = 2; // 编译错误 :private 继承后,在外部无法访问public成员 _test.m_testB = 2; // 编译错误 :private 继承后,在外部无法访问protected成员 _test.m_testC = 2; // 编译错误 :无论哪种继承,都无法访问private成员 system("pause"); return 0; }
4.总结
1.不管继承方式如何,基类中的 private 成员在派生类中始终不能使用(不能在派生类的成员函数中访问或调用)。
2.如果希望基类的成员能够被派生类继承并且毫无障碍地使用,那么这些成员只能声明为 public 或 protected;只有那些不希望在派生类中使用的成员才声明为 private。
3.如果希望基类的成员既不向外暴露(不能通过对象访问),还能在派生类中使用,那么只能声明为 protected。
4.基类成员在派生类中的访问权限不得高于继承方式中指定的权限。例如,当继承方式为 protected 时,那么基类成员在派生类中的访问权限最高也为 protected,高于 protected 的会降级为 protected,但低于 protected 不会升级。再如,当继承方式为 public 时,那么基类成员在派生类中的访问权限将保持不变。
以上来自https://blog.csdn.net/a924282761/article/details/124352983
参考资料
参考资料来源于黑马程序员等