C++ C++;继承未返回正确的值 #包括 #包括 阶级基础 { 公众: INTA; int b; 无效读取(); void display(); 受保护的: INTC; }; void base::read() { couta>>b>>c; } void base::display() { cout

C++ C++;继承未返回正确的值 #包括 #包括 阶级基础 { 公众: INTA; int b; 无效读取(); void display(); 受保护的: INTC; }; void base::read() { couta>>b>>c; } void base::display() { cout,c++,C++,当您实例化d时,您不会初始化基类的数据成员。它们的值是不确定的(不会对默认初始化的内置类型或POD执行初始化),从它们读取实际上是未定义的行为 您必须确保在读取基类数据成员之前对其进行初始化。根据您的需要,可以通过多种方式进行初始化。至少,您可以通过在构造函数中对其进行值初始化来确保其初始化为零: #include<iostream.h> #include<conio.h> class base { public: int a; int b; void re

当您实例化
d
时,您不会初始化基类的数据成员。它们的值是不确定的(不会对默认初始化的内置类型或POD执行初始化),从它们读取实际上是未定义的行为

您必须确保在读取基类数据成员之前对其进行初始化。根据您的需要,可以通过多种方式进行初始化。至少,您可以通过在构造函数中对其进行值初始化来确保其初始化为零:

#include<iostream.h>
#include<conio.h>

class base
{
public:
  int a;
  int b;
  void read();
  void display();
protected:
  int c;
};
void base :: read()
{
  cout<<"\nEnter values of a , b and c :";
  cin>>a>>b>>c;
}
void base :: display()
{    
  cout<<"\nValues of a,b and c :"<<a<<" "<<b<<" "<<c;
}
class derived : public base
{
  int x;
public:
  int y;
  void read();
  void display();
protected:
  int z;
};
void derived :: read()
{
  x=a;
  y=b;
  z=c;
}
void derived :: display()
{
  cout<<"\nValue of A :"<<a<<" "<<x;
  cout<<"\nValue of B :"<<b<<" "<<y;
  cout<<"\nValue of C :"<<c<<" "<<z;
}
void main()
{
  clrscr();
  base b; 

  cout<<"\nBase Class :";

  b.read();
  b.display();
  derived d;
  cout<<"\nDerived Class :";
  d.read();
  d.display();       

  getch();
}   

这将导致您调用
d.read()
设置
d.x
d.y
d.z
0
,因为它所做的一切都是分别从
a
b
c
赋值。

派生类的方法不会自动调用基类的相同方法-它会替换基本实现,不会添加到基类中。如果如果你也想使用基类实现,你必须自己去做

class base
{
 public:
  base() : a(), b(), c() {} // default constructor
  ...

创建
Derived
的实例时,它不会获取从控制台分配给
Base
实例的
a
b
c
的值:它是另一个独立的对象

void derived :: read()
{
    base::read();
    x=a;
    y=b;
    z=c;
}
这实际上将垃圾放入
x
y
z
中。
您可以在
derived::read()
内部调用
base::read()
来初始化
a
b
c
我猜您尝试了以下操作:

 void derived :: read() {
     x=a;
     y=b;
     z=c;
 }
#包括
#包括
阶级基础
{
公众:
INTA;
int b;
虚拟空读();
虚拟虚空显示();
受保护的:
INTC;
};
void base::read()
{
couta>>b>>c;
}
void base::display()
{    

请正确地缩进代码,而不是给每个行自己随机的缩进。在代码示例中,您不做任何多态性,所以我不明白为什么您会期望继承影响任何东西。无论您使用什么资源来学习C++,现在是时候找到更好的。您应该声明哪些值是您期望看到的。不可以不删除。我们的评论。一旦你问了一个问题,它不仅是你的,而且是公开的。我正在恢复最初问的问题,以便评论和回答继续有意义。
   #include<iostream.h>
    #include<conio.h>
    class base
    {
     public:
         int a;
         int b;
         virtual void read();
         virtual void display();
     protected:
         int c;
     };
    void base :: read()
    {
        cout<<"\nEnter values of a , b and c :";
        cin>>a>>b>>c;
    }
    void base :: display()
    {    
        cout<<"\nValues of a,b and c :"<<a<<" "<<b<<" "<<c;
    }

    class derived : public base
    {
         int x;
     public:
         int y;
         virtual void read();
         virtual void display();
     protected:
         int z;
     };

     void derived :: read()
     {
         base::read()
         x=a;
         y=b;
         z=c;
     }

     void derived :: display()
     {
         base::display()
         cout<<"\nValue of A :"<<a<<" "<<x;
         cout<<"\nValue of B :"<<b<<" "<<y;
         cout<<"\nValue of C :"<<c<<" "<<z;
     }

     void main()
     {
         clrscr();
         base b; 

         cout<<"\nBase Class :";

         b.read();
         b.display();
         derived d;
         cout<<"\nDerived Class :";
         d.read();
         d.display();       

         getch();
     }