类内部成员的访问权限容易理解,而在继承时设定的权限设置少有注意。
比如近几天碰到的问题:
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函数使用:
Worker *pw = new Worker(20);
cout << pw->GetAge() << endl;
直接报错:
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的成员函数也是无法访问的。
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成员能在基类和继承类中访问,不能被其他外部代码访问。
(待续)