C++中继承的函数作用于基类还是派生类元素?附代码示例咨询
C++继承中成员函数访问的成员变量问题
嘿,我来帮你理清这个C++继承的问题~首先你的代码里有几个语法小错误,我先帮你修正成可编译的版本,再一步步解答你的问题:
#include <iostream> using namespace std; class base { int hello; public: base() { hello = 5; } // 修正:构造函数需要加括号 void show() { cout << hello; } }; class derived : public base { // 修正:继承的是base类,不是hello变量 int hello; public: derived() { hello = 2; } void show(); // 修正:成员函数声明需要指定返回类型 }; // 实现派生类的show函数 void derived::show() { cout << hello; }
一、调用show()会输出什么?
如果你创建派生类对象并调用show(),比如:
int main() { derived d; d.show(); return 0; }
默认会输出 2。
二、原因是什么?
这里核心是C++的**名称隐藏(Name Hiding)**规则:当派生类定义了和基类同名的成员变量(这里两个类都有int hello),派生类的成员会“隐藏”基类的同名成员。
在派生类的show()函数里,你直接写hello时,编译器会优先查找当前类(derived)的成员,所以会访问派生类里赋值为2的hello,自然输出2。
补充一句:如果派生类没有重写show(),调用d.show()会触发基类的show(),这时候基类的函数只会访问自己的hello,输出5——但你的代码里派生类声明了show(),所以会调用派生类的版本(前提是你实现了它,不然会报链接错误)。
三、如何让它输出另一个值?
分两种场景来说:
场景1:现在输出2,想改成输出5(基类的hello值)
有两种简单方法:
- 方法一:在派生类show()里显式指定访问基类成员
修改派生类的show()实现:
void derived::show() { cout << base::hello; // 用base::限定符强制访问基类的hello }
这样调用d.show()就会输出5。
- 方法二:删除派生类的show()声明
把派生类里的void show();删掉,这样调用d.show()时,会自动调用基类的show(),基类函数访问自己的hello,输出5。
场景2:如果当前输出5(比如没重写show()),想改成输出2
那就在派生类中重写show()函数,直接访问派生类自己的hello,就像最开始修正后的代码那样,调用后就会输出2。
内容的提问来源于stack exchange,提问作者user62956
相关产品推荐
相关产品推荐

