2013-12-11 3 views
-2
#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(); 
} 

вход & Выход: Базовый класс: Введите значения а, б и в: 1 2 3С наследования ++, не возвращает правильные значения

значения а, б и в: 1 2 3

производный класс: Значение A: 1342 1342 Значение B: -14 -14 Значение C: 11330 11330

Я хотел бы использовать этот код так, чтобы я мог бы легко понять наследование частных, общественных и защищенных данных ...

Пожалуйста, исправьте этот код так, чтобы я мог реально получить знать о C++ наследования или пожалуйста ответ с кодом, который объяснить с ++ наследования ..

+4

Пожалуйста, откорректируйте свой код, вместо того чтобы давать каждой строке свой собственный случайный отступ. – interjay

+3

Вы не делаете никакого полиморфизма в своем примере кода, поэтому я не понимаю, почему вы ожидаете, что наследование повлияет на что-либо. Какой бы ресурс вы не использовали для изучения C++, пришло время найти лучшее. – StoryTeller

+0

Вы должны указать, какие значения вы ожидаете увидеть. – juanchopanza

ответ

3

Когда вы создаете экземпляр d, вы не инициализируете элементы данных базового класса. Их значение не определено (инициализация не выполняется для инициализированных по умолчанию встроенных типов или POD), а чтение из них - фактически неопределенное поведение.

Вы должны убедиться, что вы инициализируете элементы данных базового класса, прежде чем читать их. Есть много способов сделать это, в зависимости от ваших потребностей. По крайней мере, вы могли убедиться, что они получают нулевой инициализируется значением инициализации их в конструкторе:

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

Это приведет ваш призыв к d.read() заходящего d.x, d.y, d.z к 0, так как все это делает назначается из a, b и c соответственно.

1

метод производного класса не автоматически вызывать тот же метод базового класса - это заменяет базовую реализацию, не добавить в его. Если вы хотите использовать реализацию базового класса, вы тоже должны это сделать.

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

При создании экземпляра Derived он не получает значения ab и c вы назначили от консоли к экземпляру Base: это другой, зависимы друг от друга, объект!

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

Это фактически ставит мусор внутри xy и z. Вы можете вызвать base::read() внутри derived::read() для инициализации ab и c

1

Я предполагаю, что вы пытались сделать что-то вроде следующего:

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

Пожалуйста, обратите внимание, что для использования полиморфизма вы должны использовать виртуальный ключевое слово однако, чтобы не замаскировать функцию полностью, это было бы актуально в случае указателя и выделения некоторому базовому указателю объекта производного типа (ов).

Также обратите внимание, что способ, которым вы реализовали чтение, фактически поместит мусор в xyz, так как abc не считывает функцию чтения базового объекта, так как никто ее не называет. Вот почему вы получаете случайные значения там вместо значений, введенных в консоль.

Предлагаю немного прочитать о полиморфизме C++. Я нахожу ресурс ниже хорошего учебника: http://www.cplusplus.com/doc/tutorial/polymorphism/

Я надеюсь, что это поможет.

Смежные вопросы