c++类成员的访问权限在继承中行为

父类的protected成员和public成员都是可以被子类直接访问的,但是private成员是子类不能直接访问的。
其中protected和public的区别protected不能被外部访问,只能在子类内部被访问,而public则可以被外部直接访问。
在这里插入图片描述

#include <iostream>

class Animal {
    
    
public:
    virtual void eat() {
    
    
        std::cout << "eat" << std::endl;
    }

    void type() {
    
    
        std::cout << "animal" << std::endl;
    }

    virtual void print() {
    
    
        std::cout << "animal age:" << age <<std::endl;
    }

    u_int16_t weight = 100;
protected:
    u_int16_t age = 18;
};

class Dog : public Animal {
    
    
public:
    virtual void eat() override {
    
    
        std::cout << "dog eat" << std::endl;
    }
    void type() {
    
    
        std::cout << "dog type" << std::endl;
    }
    void print() override {
    
    
        std::cout << "age:" << age << std::endl;
        std::cout <<"color:" << color << std::endl;
    }
protected:
    std::string color = "black";
};

int main() {
    
    
    Animal ani;
    ani.eat();
    ani.type();

    Dog dog;
    dog.weight;
    dog.age; // 编译不过。虽然在public继承,但是他在父类中就是protected

    // Animal* p_ani = new Dog();

    // // p_ani->eat();
    // // p_ani->type();
    // // p_ani->print();

    // // Dog* p_dog = new Dog();
    // p_dog->type();
    // p_dog->weight;
}
#include <iostream>

class Animal {
    
    
public:
    virtual void eat() {
    
    
        std::cout << "eat" << std::endl;
    }

    void type() {
    
    
        std::cout << "animal" << std::endl;
    }

    virtual void print() {
    
    
        std::cout << "animal age:" << age <<std::endl;
    }

    u_int16_t weight = 100;
protected:
    u_int16_t age = 180;
};

class Dog : public Animal {
    
    
public:
    virtual void eat() override {
    
    
        std::cout << "dog eat" << std::endl;
    }
    void type() {
    
    
        std::cout << "dog type" << std::endl;
    }
    void print() override {
    
    
        std::cout << "age:" << age << std::endl;
        std::cout <<"color:" << color << std::endl;
    }
protected:
    std::string color = "black";
};

class LittleDog : public Dog {
    
    
public:
    void print() {
    
    
    	// 这里的age是经过protected、public、public过来的,但是依然是protected,因此只能在内部比如此处访问,而不能被对象的用户直接访问
        std::cout << "age:" << age << std::endl; 
    }
};

int main() {
    
    
    Animal ani;
    ani.eat();
    ani.type();

    Dog dog;
    dog.weight;
    
    LittleDog ld;
    ld.print();
    // ld.age;  //编译不过,因为age是protected成员,只能在ld的内部被访问,比如print函数
}

猜你喜欢

转载自blog.csdn.net/ustc_sse_shenzhang/article/details/127333965