鱼C论坛

 找回密码
 立即注册
查看: 1471|回复: 7

[已解决]对protected使用的疑惑

[复制链接]
发表于 2021-3-25 23:33:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位大佬 protected修饰的数据成员只有子类,朋友和他自己能自由使用  那这段代码在这里为什么会报错呢
class Animal
{
public:
    Animal(std::string theName);
    void eat();
    void sleep();
    void drool();

protected:
    std::string name;
};
.
.
.
   Pig pig("小猪猪");
    Turtle turtle("小甲鱼");

    pig.name = "小甲鱼";//此处会报错
protected是在基类animal里修饰 name的 那子类pig也就能够修改名字? 我不知道哪里错了
最佳答案
2021-3-26 10:44:28
如果是 protected,那么你只能通过 this指针访问,如 this->name = s;,用this访问name变量
请问你可以在main函数中这样写吗?
this->name = "123";
#include <iostream>
#include <string>

class A {
protected:
    std::string name;
};

class B: public A {
public:
    void set_name(std::string s) {
        this->name = s;
    }
    std::string get_name() {
        return this->name;
    }
};

int main() {
    B b;
    b.set_name("123");
    // this->name = "123";
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-26 00:09:24 | 显示全部楼层
你对 ”子类中” 是不是有什么误解
子类中是这样的

this->name = "小甲鱼";
this指针指向当前对象

pig.name = "小甲鱼";//此处会报错
这是在子类外面操作的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-26 08:29:46 | 显示全部楼层
人造人 发表于 2021-3-26 00:09
你对 ”子类中” 是不是有什么误解
子类中是这样的

protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成privat
pig.name 也是调用的子类对象的成员函数呀 这也算在子类外进行操作吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-26 09:01:14 | 显示全部楼层
仲夏夜之梦626 发表于 2021-3-26 08:29
protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部 ...

你的误解很深,对于类是public,和对于对象是public是不一样的
什么叫类内和类外
就像你的Animal类,eat() sleep() drool()这些方法的定义叫类内
你都已经创建对象了,Pig pig,Pig是类  pig是什么?是对象,它不是类  怎么可能是类内呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-26 10:44:28 | 显示全部楼层    本楼为最佳答案   
如果是 protected,那么你只能通过 this指针访问,如 this->name = s;,用this访问name变量
请问你可以在main函数中这样写吗?
this->name = "123";
#include <iostream>
#include <string>

class A {
protected:
    std::string name;
};

class B: public A {
public:
    void set_name(std::string s) {
        this->name = s;
    }
    std::string get_name() {
        return this->name;
    }
};

int main() {
    B b;
    b.set_name("123");
    // this->name = "123";
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-26 14:52:44 | 显示全部楼层
yuxijian2020 发表于 2021-3-26 09:01
你的误解很深,对于类是public,和对于对象是public是不一样的
什么叫类内和类外
就像你的Animal类,eat() ...

我刚刚看了下书 书上写的 protected修饰的成员能被派生类成员和友元访问,这些成员只对派生类对象是可访问的,我也迷糊了。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-26 14:54:48 | 显示全部楼层
人造人 发表于 2021-3-26 10:44
如果是 protected,那么你只能通过 this指针访问,如 this->name = s;,用this访问name变量
请问你可以在m ...

意思是如果要修改名字,只能在派生类中定义一个修改名字的成员函数,不能直接对名字进行赋值?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-26 14:56:45 | 显示全部楼层
仲夏夜之梦626 发表于 2021-3-26 14:54
意思是如果要修改名字,只能在派生类中定义一个修改名字的成员函数,不能直接对名字进行赋值?

public的可以,protected和private的不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 17:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表