Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 派生类中隐藏的成员变量_C++ - Fatal编程技术网

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++,所以我只能告诉你它是如何工作的,而不是为什么。