C ++继承没有返回正确的值

时间:2013-12-11 14:14:13

标签: c++

#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();
}   

输入&amp;输出: 基类: 输入a,b和c的值:1 2 3

a,b和c的值:1 2 3

派生类: A的值:1342 1342 B的值:-14 -14 C值:11330 11330

我想使用此代码,以便我可以轻松了解私有,公共和受保护数据的继承...

请更正此代码,以便我真正了解c ++继承 或者请回复解释c ++继承的代码..

4 个答案:

答案 0 :(得分:4)

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

在读取基类数据成员之前,必须确保初始化它们。根据您的需要,有很多方法可以做到这一点。至少,您可以确保它们通过在构造函数中初始化它们的值进行零初始化:

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

这将导致您致电d.read()设置d.xd.yd.z0,因为它所做的一切都是从{{1分别是{},ab

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

当您创建Derived的实例时,它不会获得您从控制台分配给a实例的b cBase的值:这是另一个独立的对象!

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

这实际上会将垃圾放入x yz。 您可以在base::read()内拨打derived::read()来初始化a bc

答案 3 :(得分:2)

我猜你试图做类似以下的事情:

   #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();
     }   

请注意,要使用多态,您应该使用virtual关键字,以便不完全屏蔽函数,但是,这在指针的情况下是相关的,并且将某个基指针分配给派生类型的对象。

另请注意,实现读取的方式实际上会将垃圾放到xyz中,因为abc不会通过基础对象的读取功能读取,因为没有人调用它。这就是为什么你在那里得到随机值,而不是在控制台中输入的值。

我建议阅读一些关于c ++多态性的内容。 我在下面找到了一个很好的教程资源:http://www.cplusplus.com/doc/tutorial/polymorphism/

我希望这会有所帮助。