#include<iostream> #include<string> using namespace std; class A { protected: string m; double p; public: A(const string& a = "", double b = 0) { m = a; p = b; } string getM() { return m; } double getP() { return p; } virtual void Show() { cout << m << "," << p << endl; } }; class B :public A{ int s; public: B(const string& a, double b, int c = 3) { s = c; } void Show() { cout << m << "," << p << "," << s<<endl; } friend int operator+(B&, B&); }; int operator+(B& b1, B& b2) { return b1.s + b2.s; } int main() { B s1("hhh",300), s2("yyy", 2400, 2); s1.Show(); A& f = s1; f.Show(); cout << f.getM() << "," << f.getP() << endl; cout << s2.getM() << "," << s2.getP() << endl; cout << s1 + s1 << endl; }s1.Show();运行结果是多少?这种语法现象叫什么?
时间: 2024-03-28 21:39:58 浏览: 38
运行结果是 "hhh,0,0",因为在 B 类的构造函数中,虽然继承了 A 类的构造函数,但是并没有对 A 类的数据成员 m 和 p 进行初始化,所以默认值为 "" 和 0。在 s1 对象的 Show() 函数中,输出了 m、p 和 s,因为 s1 对象的 s 值为默认值 3,所以输出为 "hhh,0,3"。
这种语法现象叫做隐藏(hidden),即在派生类中定义了一个和基类同名的成员函数或变量,那么基类的同名成员就被隐藏了,派生类对象调用同名函数或变量时只能访问到自己定义的那个。在本例中,B 类的 Show() 函数隐藏了 A 类的同名函数,所以在调用 s1 对象的 Show() 函数时,只能访问到 B 类中定义的 m、p 和 s。
阅读全文