C++ 继承的核心规则与常见陷阱
继承能让类之间复用共性,但也带来了不少隐藏的细节。下面梳理一下容易出错的地方。
语法与访问权限
class Person { /* ... */ };
class Student : public Person { /* ... */ };
基类的 private 成员派生类完全碰不到——虽然它们物理上存在于子类对象中,但编译器禁止访问。如果想让派生类使用又不暴露给外面,用 protected。
继承后的访问权限取两者中更严格的:public 继承不会放大,protected 或 private 继承只会收紧。记住这个就基本够用。
切片:把子类当父类用
把一个子类对象赋给父类变量,父类部分会被拷贝过去,子类特有的字段就扔掉了——这叫切片。反过来不行,父类不能直接塞给子类。
Person p;
Student s;
// s = p; // 编译错误:父类 -> 子类不行
p = s; // 切片,只留 Person 部分
如果用指针或引用,就不会切片,而是单纯改变看待同一块内存的视角。
Student s;
Person& ref = s; // 没切片,ref 只是当做 Person 用
同名成员:隐藏而非重载
子类里如果定义了和父类同名的函数,父类的同名函数就藏起来了,哪怕参数列表不同。这和重载不一样,重载要求在同一作用域。
class Person {
public:
void fun() { cout << "Person::func()" << endl; }
int _num = 111;
};
class Student : public Person {
public:
void fun(int) { cout << "Student::func(int)" << endl; }
void Print() {
cout << _num << endl;
cout << Person::_num << endl;
}
_num = ;
};
{
Student s;
s.Person::();
}


