-
派生类不能直接访问基类的私有(private)成员(包括函数和变量)
-
这是因为私有成员是在类的封装性中的重要一环,它们只能被同一个类中的其他成员访问,这样可以保护这些成员不被外部访问或修改。
-
如果你想让派生类能够访问基类的某个成员,你可以将该成员设置为保护(protected)而不是私有。
-
保护成员可以被同一个类中的其他成员以及派生类的成员访问,但是仍然不能被该类的对象访问。
- 派生类不能直接访问基类中的私有成员,包括虚函数
- 但是派生类可以重载基类的私有虚函数
#include<iostream>
class Base {
private:
virtual void privateVirtual() {
std::cout << "Base private virtual function called" << std::endl;
}
public:
void callPrivateVirtual() {
privateVirtual();
}
};
class Derived : public Base {
private:
void privateVirtual() {
std::cout << "Derived private virtual function called" << std::endl;
}
};
int main() {
Derived* d=new Derived();
Base* s = d;
s->callPrivateVirtual(); // Outputs: Derived private virtual function called
return 0;
}
一个类的保护成员可以被以下对象访问
- 该类的成员
- 该类的友元(函数和类)
- 该类派生出来的子类的成员函数
友元类在 C++ 中可以访问其友元关系类的所有成员,无论这些成员是公开(public),保护(protected)还是私有(private)的。
class ClassA {
private:
int privateDataA;
protected:
int protectedDataA;
public:
ClassA() : privateDataA(1), protectedDataA(2) {}
friend class ClassB; // ClassB是ClassA的友元类
};
class ClassB {
public:
void accessClassA(ClassA &a) {
std::cout << "Private data of ClassA: " << a.privateDataA << std::endl;
std::cout << "Protected data of ClassA: " << a.protectedDataA << std::endl;
}
};
int main() {
ClassA a;
ClassB b;
b.accessClassA(a); // 输出:Private data of ClassA: 1 和 Protected data of ClassA: 2
return 0;
}
派生类可以在继承基类时选择公开(public)、保护(protected)或私有(private)继承
- 如果派生类选择公开继承,那么基类的公有成员在派生类中仍然是公有的,基类的保护成员在派生类中仍然是保护的。
- 如果派生类选择保护继承,那么基类的公有成员和保护成员在派生类中都变成保护的。
- 如果派生类选择私有继承,那么基类的公有成员和保护成员在派生类中都变成私有的。
class Base {
protected:
int protectedMember;
};
class Derived : public Base {
public:
void accessBase() {
protectedMember = 10; // 可以访问
}
};
int main() {
Derived d;
d.accessBase();
// d.protectedMember = 20; // 错误:不能直接访问保护成员
return 0;
}