继承基础概念
继承是类设计层次复用的重要手段。基类(父类)定义通用特性,派生类(子类)在此基础上扩展。
访问控制与继承方式
继承后,基类成员的可见性取决于继承方式(public/protected/private)。
- 私有成员:始终不可见。即使被继承到派生类对象中,语法上禁止在派生类内外直接访问。
- 保护成员:适合需要在派生类内部访问但不希望外部直接暴露的场景。
- 公共成员:遵循 Min(成员在基类的访问限定符,继承方式) 原则。
对象赋值与类型转换
不同类型对象赋值需考虑类型兼容性。
- 父类不能赋值给子类:子类特有的成员变量无法从父类获取,强转会导致未定义行为。
- 子类可赋值给父类:发生对象切片(Slicing),仅拷贝父类部分数据。这并非类型转换,而是赋值兼容。
class Person {
public:
void Print() {
cout << "name:" << _name << endl;
cout << "age:" << _age << endl;
}
protected:
string _name = "peter";
int _age = 18;
};
class Student : public Person {
protected:
int _stuid;
};
int main() {
Person p;
Student s;
// s = p; // 错误:父类不能赋值给子类
p = s; // 正确:发生对象切片
return 0;
}
作用域与隐藏规则
编译时查找规则决定了同名成员的访问优先级。
- 隐藏(重定义):子类成员屏蔽父类同名成员。若需访问父类版本,需显式指定作用域
Parent::Member。 - 函数隐藏:只要函数名相同即构成隐藏,无需参数列表一致(重载要求同一作用域)。
class Person {
public:
{ cout << << endl; }
:
string _name = ;
_num = ;
};
: Person {
:
{ cout << << endl; }
{
cout << << _name << endl;
cout << _num << endl;
cout << Person::_num << endl;
}
:
_num = ;
};
{
Student s;
s.();
s.Person::();
;
}


