1. public 继承
派生类成员可以直接访问 基类的public成员,也可通过派生类对象直接访问;
派生类成员可以直接访问 基类的 protected 成员,但不能通过派生类对象访问基类的protected 成员(当然基类的对象也不可以)
派生类成员不可以直接访问基类的 private 成员。
基类的public protected 成员类似成为派生类的 public protected 成员;基类的private成员在派生类内无法访问!
#include <iostream>
class Base
{
public:
void BaseShow_public()
{
std::cout << "BaseShow_public()" << std::endl;
}
protected:
void BaseShow_protected()
{
std::cout << "BaseShow_protected()" << std::endl;
}
private:
void BaseShow_private()
{
std::cout << "BaseShow_private()" << std::endl;
}
};
class Derived : public Base
{
public:
void DerivedShow()
{
BaseShow_public();
BaseShow_protected();
//BaseShow_private(); // error
}
};
int main()
{
Derived d;
d.DerivedShow();
d.BaseShow_public();
Base b;
b.BaseShow_protected(); //error
return 0;
}
2. protected 与 private 继承
派生类成员可以访问基类的 public protected 成员,而不能访问 private 成员。
当然派生类对象就不能访问基类的任意成员了。
protected 继承时,基类的 public protected 成员成为派生类的 protected 成员;
private 继承时,基类的 public protected 成员成为派生类的 private 成员;
而 基类的 private 成员两种情况下 在派生类内 都无法访问!
class Derived : private Base
{
public:
void DerivedShow()
{
BaseShow_public();
BaseShow_protected();
// BaseShow_private();
}
};
所以,进一步的区别体现在 派生类的派生类(新增一个公有继承于 Derived 的新类):
class DDerived : public Derived
{
public:
void DDerivedShow()
{
BaseShow_public();
BaseShow_protected();
}
};
当 Derived 保护继承于 Base 类时,Base 的public protected 成员 成为 Derived 的 protected 成员,所以 DDerived 成员可以访问之;
当 Derived 私有继承于 Base 类时,Base 的public protected 成员 成为 Derived 的 private 成员,所以 DDerived 成员 不可访问之。
3. something brief
通过派生类对象,只能访问 public 继承的 基类的public 成员;
无论是哪种继承方式,派生类成员可以直接访问除了 基类的 private 成员外的所有成员。
4. using 改变基类成员在派生类的访问权限
注意:不能用于基类的私有成员!(如下面代码段在 vs2019 会报错)
#include <iostream>
class Base
{
private:
void BaseShow_private()
{
std::cout << "BaseShow_private()" << std::endl;
}
};
class Derived : public Base
{
public:
using Base::BaseShow_private; //vs2019报错,提示: Base::BaseShow_private已声明不可访问
};
int main()
{
Derived d;
Base b;
return 0;
}
下面有一个 using 改变基类成员访问特性的例子:
正常情况下,这里经过 private 继承,BaseShow_protected 成为Derived的私有成员,通过Derived对象访问 BaseShow_protected成员是非法的,但是加上 using 声明改变了 BaseShow_protected对于Derived类的访问权限,下面代码可以正常执行了。
#include <iostream>
class Base
{
protected:
void BaseShow_protected()
{
std::cout << "BaseShow_protected()" << std::endl;
}
};
class Derived : private Base
{
public:
using Base::BaseShow_protected;
};
int main()
{
Derived d;
d.BaseShow_protected();
return 0;
}