C++ 访问数据成员的继承成员函数
考虑下面的示例代码:C++ 访问数据成员的继承成员函数,c++,inheritance,member-functions,datamember,C++,Inheritance,Member Functions,Datamember,考虑下面的示例代码: #include <iostream> using namespace std; class A { private: static int a; int b; protected: public: A() : b(0) {} void modify() { a++; b++; }
#include <iostream>
using namespace std;
class A
{
private:
static int a;
int b;
protected:
public:
A() : b(0) {}
void modify()
{
a++;
b++;
}
void display()
{
cout << a <<"\n";
cout << b <<"\n";
}
};
int A::a=0;
class B : public A {
private:
int b;
public:
B(): b(5)
{
}
};
int main()
{
A ob1;
B ob2;
ob1.display();
ob2.display();
return 0;
}
#包括
使用名称空间std;
甲级
{
私人:
静态int a;
int b;
受保护的:
公众:
A():b(0){}
void modify()
{
a++;
b++;
}
无效显示()
{
cout它将访问A::b
。类A
中的display
方法实现根本不知道b::b
的存在,更不用说使用它了。出于所有的意图和目的,b::b
与A::b
是分开的。只有在b
本身的范围内,名称冲突才会产生b
参考b::b
,隐藏A::b
。成员变量不能是虚拟的
,它将访问A::b
。类A
中的显示
方法实现对b::b
的存在没有任何线索,更不用说使用了。出于所有目的,b::b
与A::b
分开。仅在b
本身的范围内,名称冲突使b
引用b::b
,隐藏A::b
。成员变量不能是虚拟的它是classA
A::display()
无法访问B个私有成员。这是classA
A::display()
无法访问B个私有成员。ob2.display()
将访问派生类成员。
成员函数调用总是在this
上求值,this->display()
如果this
指向基类的对象,那么display()
函数中对b
的任何引用都被求值为基类的this->b
这是因为基类的display()
基类的方法
void B::display()
{
//cout << a <<"\n";
cout << b <<"\n";
A::display();
}
void B::display()
{
//coutob2.display()
将访问派生类成员。
成员函数调用总是在this
上求值,this->display()
如果this
指向基类的对象,那么display()
函数中对b
的任何引用都被求值为基类的this->b
这是因为基类的display()
基类的方法
void B::display()
{
//cout << a <<"\n";
cout << b <<"\n";
A::display();
}
void B::display()
{
//库特:那么class B
继承class A的display()
函数有什么用呢class B
从class A
继承了display()
函数,所以我期望display()
要访问类B的B
@LinuxPenseur有很多用途。这并不是其中之一。要实现您想要的功能,您既不能引入新变量并通过基构造函数调用初始化基类B
,也不能在基类中引入一个虚拟
方法,该方法返回的值>b
在基类中,并重写它以返回派生类中的b
的值。或者在派生类中有一个方法,该方法访问派生类成员,并通过调用访问基类成员的基类方法进一步传播调用。谢谢:类b
继承clas有什么用s A的
display()
函数。B类
继承了A类
的函数
display()
,因此我期望display()
要访问类B的B
@LinuxPenseur有很多用途。这并不是其中之一。要实现您想要的功能,您既不能引入新变量并通过基构造函数调用初始化基类B
,也不能在基类中引入一个虚拟
方法,该方法返回的值>b
在基类中,并重写它以返回派生类中的b
的值。或者在派生类中有一个方法,该方法访问派生类成员,并通过调用访问基类成员的基类方法进一步传播调用。请注意,显示函数在类a中,以防错过它。你能根据它重新表述你的答案吗。我这样说是因为ob2.display似乎没有访问派生类成员。现在我有一个疑问:)。为什么这个指针在ob2.display()
指向基类的对象?ob2是派生类的对象。@LinuxPenseur:Becasuedisplay()
是基类的成员。对display()的调用
是在基类A
的范围内解析的。基类对可能从它派生的任何其他类一无所知,如果你想一想,没有这种反向依赖是有道理的。派生类中的b
只有在派生类的范围内才会被引用。请注意,显示函数是在类A中,以防您错过了它。您能否根据它重新表述您的答案。我这样说是因为ob2.display似乎无法访问派生类成员。现在我有一个疑问:)。在ob2.display()的情况下,为什么这个指针指向基类的对象?ob2是der的对象