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

本文探讨了C++中父类成员在子类中的访问权限。通过具体例子说明了public和protected成员如何被子类访问,而private成员则不可访问。同时展示了不同访问修饰符在继承中的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

父类的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函数
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值