C++ 派生类中隐藏的成员变量
这是我的密码。基类有成员变量C++ 派生类中隐藏的成员变量,c++,C++,这是我的密码。基类有成员变量i,派生类也有相同的成员变量名。现在,客户端创建指向派生的基本ptr,并使用i直接访问成员变量。我以为它会调用派生成员变量,而不是调用基类变量。我不知道这是为什么 #include<iostream> using namespace std; class A{ public: int i; A(int ii=5):i(ii){} virtual void display(){
i
,派生类也有相同的成员变量名。现在,客户端创建指向派生的基本ptr,并使用i
直接访问成员变量。我以为它会调用派生成员变量,而不是调用基类变量。我不知道这是为什么
#include<iostream>
using namespace std;
class A{
public:
int i;
A(int ii=5):i(ii){}
virtual void display(){
cout<<" In A :"<<i<<endl;
}
};
class B: public A{
public:
int i;
B(int ii=7):i(ii){}
void display(){
cout<<" In B :"<<i<<endl;
}
};
int main(){
A * aptr = new B();
cout << aptr->i <<endl; // expected B::i but gave A::i
aptr->display();
B bb;
bb.display();
return 0;
}
#包括
使用名称空间std;
甲级{
公众:
int i;
A(intⅡ=5):i(ii){}
虚拟空显示(){
C++中的成员变量不受继承的虚函数的影响。
如果B
继承自A
,并且它们都定义了名为i
的成员,则这两个变量都存在,并且都是对象的独立部分
由于指针的类型为A*
,表达式aptr->i
将解析为A
的i
版本
作为旁注,B
还可以显式访问a
版本的i
,只要它不是私有的
class B: public A{
public:
int i;
B(int ii=7):i(ii){}
void display(){
cout<<" In B :"<<i<<endl;
cout<<" In A :"<<A::i<<endl;
}
};
B类:公共A类{
公众:
int i;
B(intii=7):i(ii){}
无效显示(){
cout这就是我想问的问题,幸运的是我能够在main func中写下我需要的东西。
请检查并让我知道为什么A&和A实例的行为不同
int main(){
A * aptr = new B();
cout << aptr->i <<endl;
aptr->display();
B *bptr = dynamic_cast<B*>(aptr);
bptr->display();
cout << bptr->i <<"\t" <<bptr->A::i<<endl;
A & aref = static_cast<A&>(*aptr);
cout <<endl <<"Called ref : "<<aref.i<<endl;
aref.display(); // here it calls B::display
A aa(*aptr);
cout <<endl <<"Called Inst : "<<aa.i<<endl;
aa.display(); // here it calls A::display
delete aptr;
return 0;
}
intmain(){
A*aptr=新的B();
我能显示()吗;
成员变量不能是“虚拟的”类似于成员函数。成员变量不是虚拟方法。如果您想让i
像虚拟方法一样运行,请将其包装在getter/setter中并使其成为虚拟的。不,我的观点是,当类实例化时,vptr成为对象成员的一部分,例如,类a和类B将具有单独的vptr和vtable。当我创建新的B()时,B的vptr连接到它。所以当我调用ptr->display()时B的vptr被拾取,而不是A,因此B::display被正确调用。同样,当我们键入ptr->i时,也不应该调用B::i。因为我们创建了B的实例,并且不是可变成员,所以当您调用aptr->i
时,您是从基类A
调用i
。另一方面,当y调用aptr->Display()
,Display
是一个虚拟函数,因此将调用B::Display()
,它将从B
类显示i
,因为i
实际上是从基类a
隐藏i
(请记住,B
对象是在A*aptr=new B();
语句中创建的,构造函数将其自身的i
变量实例化为7
)。若要引用基础A
的i
部分,您必须将其指定为A::i
。抱歉,但对答案没有印象。我想我知道这些东西。问题是为什么aptr->我调用A::i,而如果放入代码B*bptr=dynamic\u castaptr;然后调用bptr->我将调用B::i。@rocky\u mfe,为什么C++中的DES变量是一个你必须问语言创造者的变量。我没有设计C++,所以我只能告诉你它是如何工作的,而不是为什么。