困惑于c ++中的继承(公共和私有)

时间:2016-04-23 06:29:05

标签: c++ inheritance encapsulation

#include <iostream>
#include <string>
using namespace std ;
enum COLOR { Green, Blue, White, Black, Brown } ;
class Animal {
public :
    Animal() : _name("unknown") {
        cout << "constructing Animal object "<< _name << endl ;
    }
    Animal(string n,COLOR c) : _name(n),_color(c) {
        cout << "constructing Animal object "<< _name << endl ;
    }

    ~Animal() {
        cout << "destructing Animal object "<< _name << endl ;
    }
    void speak() const {
        cout << "Animal speaks "<< endl ;
    }
    void move() const { }
private :
    string _name;
    COLOR _color ;
};
class Mammal:public Animal{
public:
    Mammal(string n,COLOR c):Animal(n,c){
        cout << "constructing Mammal object "<< _name << endl ;
    }
    ~Mammal() {
        cout << "destructing Animal object "<< _name << endl ;
    }
    void eat() const {
        cout << "Mammal eat " << endl ;
    }
};

我刚刚开始从java转换到C ++,正在练习一些面向对象的编码来了解差异。

在上面的代码中,我无法从哺乳类中访问_name。

哺乳动物类是否不继承私人属性?在这种情况下,我是否必须为每个继承重新创建这些属性?

2 个答案:

答案 0 :(得分:2)

您是正确的,无法从Animal内访问Mammal的私有属性。但是,如果您来自Java,这不是新的 - 它的工作原理相同。

请参阅此链接以获取示例:Do subclasses inherit private fields?

答案 1 :(得分:1)

您无法访问类的外部私有变量,这里_name是类的私有范围变量。派生类aslo无法从base访问私有范围项。要解决此问题,可以将_name声明为protected,它将访问派生类。