关于protected类继承的编译错误疑问求解
代码编译错误原因解析
你的代码存在两个编译错误,咱们逐个拆解:
构造函数初始化列表的使用错误
你在Y的构造函数里写Y() : v(0) {}是不合法的。v是基类X的成员变量,哪怕Y以protected方式继承X,也不能在初始化列表里直接初始化基类的成员——初始化列表仅用于初始化当前类(Y)自身的成员,或者调用基类的构造函数。如果要给v赋值,应该把逻辑放在构造函数体内,写成v = 0;;或者给X添加带参数的构造函数,然后在Y的初始化列表里调用X(0)来初始化v。外部代码访问protected成员的权限问题
main函数里的cout << y->v;是核心错误。不管子类用哪种方式继承基类,类的protected成员都只能在**类内部(包括子类的成员函数)**访问,外部函数(比如main)完全没有权限直接访问对象的protected成员。哪怕Y继承了X的v,v在Y中的访问权限依然是protected,外部代码根本碰不到它。
总结一下:子类的成员函数确实能访问基类的protected成员,但外部代码不行;基类的成员变量得由基类自身初始化,或者子类在函数体内赋值,不能直接在初始化列表里操作基类的成员。
内容的提问来源于stack exchange,提问作者And.Re
相关产品推荐
相关产品推荐

