2010-01-27 5 views
0

Моя программа была: -неявное


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

struct base 
{ 
    protected: 

    void get() 
    { 
     cin>>a>>b; 
    } 

    public: 

    base(int i=0, int j=0); 

    void put() 
    { 
     cout << a << '\t' << b << "\tput 1"; 
    } 

    int a,b,c; 

    ~base() 
    { 
     cout << "base destroyed"; 
    } 
}; 

class deri : protected base 
{ 

    int c,d; 
    char w; 
    int ans; 

    public: 

    deri(int r=7, int s=0) 
     : base(r,s) 
    { 
     c=r; 
     d=s; 
     cout << "\nDerived invoked\n"; 
    } 

    void put() 
    { 
     cout << c << '\t' << d << '\t' << a << '\t' << b; 
    } 
}; 


class d2 : protected deri 
{ 
    public: 

    d2() {} 
    void start(); 
    void add() 
    { 
     get(); // ERROR HERE: Implicit conversion of 'd2 *' to 'base *' not allowed 

    } 

    ~d2(){} 
}; 

void d2::start() 
{ 
    put(); 
} 

base::base(int i, int j) 
{ 
    a=i; 
    b=j; 

    cout << "\nbase invoked\n"; 
    cout << "Enter a,b: "; 
    get(); 
} 


void main() 
{ 
    clrscr(); 
    getch(); 

} 

может кто-нибудь объяснить, что означает, что сообщ ошибка?

+0

Какая ошибка msg? – sharptooth

+0

, вероятно, тот, что находится в комментарии за 'get();': 'Неявное преобразование 'd2 *' в 'base *' не разрешено – abenthy

ответ

1

Вероятно, вы используете старый компилятор, как вы в том числе <iostream.h> вместо нового стандарта <iostream> и вы не используете пространство имен std.
После установки этого, добавив строку using namespace std; сверху и закомментировать clrscr() ваш код компилируется в MSVC8.

У вас есть ясная причина использовать protected derviation? Если нет, я бы предложил вместо этого использовать public derviation. protected derviation - это нечто довольно сложное и необычное.

+0

ничего не происходит, хотя .... n im using turbo C++ - требования школы – 2010-01-27 13:31:51

+0

Can Вы используете другой компилятор? На linux есть gcc, а на окнах есть msvc8, которые являются бесплатными и актуальными. – abenthy

0

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

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

Попробуйте использовать явно выраженный тип в функции или сделать наследование общедоступным.