您的位置:首页 > 其它

关于私有继承

2015-08-17 09:08 197 查看
类内部成员的访问权限容易理解,而在继承时设定的权限设置少有注意。

比如近几天碰到的问题:

[code]class Person
{
public:
    Person():m_age(0) {
        cout << "Person::Person()" << endl;
    }
    Person(int age): m_age(age) {
        cout << "Person::Person(int age)" << endl;
    }
    ~Person() {
        cout << "Person::~Person()" << endl;
    }
    int GetAge() {
        return m_age;
    }
    string GetName() {
        return m_name;
    }   
    string m_name;  
private:
    int m_age;
};

class Worker: Person
{
public:
    Worker() {
        cout << "Worker::Worker()" << endl;
    };
    Worker(int age): Person(age) {
         cout << "Worker::Worker(int age)" << endl;
    }
    ~Worker() {
        cout << "Worker::~Worker()" << endl;
    };
    string GetCompany() {
        return m_company;
    }   
private:
    string m_company;
};


main函数使用:

[code]Worker *pw = new Worker(20);
cout << pw->GetAge() << endl;


直接报错:

[code]error C2247: 'Person::get_age' not accessible because 'Worker' uses 'private' to inherit from 'Person'


其实这对CPP开发者来说是最基本不过的问题,private继承后,基类Person的方法不能再main代码范围内访问。常常说基类的成员函数默认情况下都将在派生类中变为私有。这话怎么理解?是相当于在Worker中定义一个

private GetAge()么?经过测试如此。pw->GetAge() 不能调用,但是在Worker的成员函数中可以调用GetAge(); 但是如果基类中的GetAge()改为private,那么在Worker的成员函数也是无法访问的。

[code]public:
string GetName() {
    return m_name;
}
string m_name;
private:
int GetAge() {
    return m_age;
}
//main.cpp
Worker *pw = new Worker(20);
cout << pw->GetName() << endl;
cout << pw->GetAge() << endl;


私有继承导致在main中两个都无法访问。

但是Work中的新定义的成员函数能访问么?

默认的private继承时:

基类中的private成员只能在基类中访问,无法在继承类以及其他外部访问。

基类中的public成员能在基类和继承类中访问,不能被其他外部代码访问。

(待续)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: