仲夏夜之梦626 发表于 2021-3-25 23:33:17

对protected使用的疑惑

各位大佬 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 00:09:24

你对 ”子类中” 是不是有什么误解
子类中是这样的

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

pig.name = "小甲鱼";//此处会报错
这是在子类外面操作的

仲夏夜之梦626 发表于 2021-3-26 08:29:46

人造人 发表于 2021-3-26 00:09
你对 ”子类中” 是不是有什么误解
子类中是这样的



protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成privat
pig.name 也是调用的子类对象的成员函数呀 这也算在子类外进行操作吗?

yuxijian2020 发表于 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是什么?是对象,它不是类怎么可能是类内呢

人造人 发表于 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;
}

仲夏夜之梦626 发表于 2021-3-26 14:52:44

yuxijian2020 发表于 2021-3-26 09:01
你的误解很深,对于类是public,和对于对象是public是不一样的
什么叫类内和类外
就像你的Animal类,eat() ...

我刚刚看了下书 书上写的 protected修饰的成员能被派生类成员和友元访问,这些成员只对派生类对象是可访问的,我也迷糊了。。。。。

仲夏夜之梦626 发表于 2021-3-26 14:54:48

人造人 发表于 2021-3-26 10:44
如果是 protected,那么你只能通过 this指针访问,如 this->name = s;,用this访问name变量
请问你可以在m ...

意思是如果要修改名字,只能在派生类中定义一个修改名字的成员函数,不能直接对名字进行赋值?

人造人 发表于 2021-3-26 14:56:45

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

public的可以,protected和private的不行
页: [1]
查看完整版本: 对protected使用的疑惑