Skip to content

Latest commit

 

History

History
120 lines (87 loc) · 3.01 KB

派生类访问基类.md

File metadata and controls

120 lines (87 loc) · 3.01 KB

派生类与private

  • 派生类不能直接访问基类的私有(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;
}

protected

一个类的保护成员可以被以下对象访问

  • 该类的成员
  • 该类的友元(函数和类)
  • 该类派生出来的子类的成员函数

友元与protected和private

友元类在 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;
}