父类的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函数
}