📜  当对C++中的派生类方法进行更严格的访问时,会发生什么情况?(1)

📅  最后修改于: 2023-12-03 14:54:14.270000             🧑  作者: Mango

C++中派生类方法访问的严格性介绍

在C++中,派生类是从基类继承而来的类,它可以扩展基类的功能,添加新的方法和数据成员,也可以覆盖基类的方法。在派生类中,对基类的访问是通过访问控制符来实现的。访问控制符有三种类型:public、protected和private。

当对C++中的派生类方法进行更严格的访问时,会发生以下情况:

  1. 访问权限被降低

通过修改访问级别的方式,可以使派生类中的某些方法变得更加严格。例如,将一个public方法修改为private或protected方法。这样,派生类的其他方法或子类就不能再访问这个方法了。

class Base {
public:
    virtual void print() {
        cout << "This is print method of Base." << endl;
    }
};

class Derived : public Base {
public:
    void print() override {
        cout << "This is print method of Derived." << endl;
    }

    void callPrint() {
        print(); // 可以正常访问
    }
};

class SubDerived : public Derived {
public:
    void callPrint() {
        // print(); 无法访问
    }
};

在上面的代码中,SubDerived无法调用print方法,因为print方法在Derived类中被定义为protected,而SubDerived是Derived的子类,它只能访问public和protected方法。

  1. 类型转换被禁止

在C++中,可以通过将一个基类指针或引用指向派生类的对象来实现对象的多态性。但如果对派生类方法访问权限进行严格,就不能再进行类型转换了。

class Base {
public:
    virtual void print() {
        cout << "This is print method of Base." << endl;
    }
};

class Derived : private Base {
public:
    void print() override {
        cout << "This is print method of Derived." << endl;
    }
};

int main() {
    Derived derived;
    // Base* base = &derived; // 转换被禁止
    // Base& base = derived; // 转换被禁止
    
    derived.print(); // 可以正常调用
    return 0;
}

在上面的代码中,将Derived类从public改为private,这样使用基类指针或引用指向派生类的对象就无法再进行类型转换了。

  1. 编译错误

如果派生类方法访问权限过于严格,就会导致编译错误。例如,如果将一个public方法修改为private方法,就会导致其他方法或子类无法访问这个方法,从而在编译时出现错误。

class Base {
public:
    virtual void print() {
        cout << "This is print method of Base." << endl;
    }
};

class Derived : public Base {
private:
    void print() override {
        cout << "This is print method of Derived." << endl;
    }
};

int main() {
    Derived derived;
    // derived.print(); // 无法访问
    
    // Base* base = &derived; // 无法进行类型转换
    // Base& base = derived; // 无法进行类型转换
    return 0;
}

在上面的代码中,将Derived类中的print方法从public改为private,导致其他方法或子类无法访问这个方法,从而在编译时出现错误。

综上所述,当对C++中的派生类方法进行更严格的访问时,会导致访问权限降低、类型转换被禁止或编译错误。需要根据具体情况来决定是否对派生类方法的访问权限进行更改。