Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2014, 00:27   #1
zla9_kolu4ka
Форумчанин
 
Регистрация: 16.09.2013
Сообщений: 149
По умолчанию виртуальные функции

(15): error C2079: "d2" использует неопределенный class "derived2"
посему??
Код:
#include <iostream>
using namespace std;
class derived2;
class base{
public:
virtual void vfunc(){
cout << "function classa base" << endl;
}
};

class derived1:public base{
public:
void vfunc(){
cout << "function classa derived1" << endl;
derived2 d2;
derived2* p1;
p1=&d2;
p1->vfunc();
}
};

class derived2:private base{
void vfunc(){
cout << "function classa derived2" << endl;
}
};

int main(){
base* p;
derived2* p1;
base b;
derived1 d1;
derived2 d2;

p=&b;
p->vfunc();

p=&d1;
p->vfunc();

char ch = getchar();
return 0;

}
ну тут наверно компилятор не знает, сколько выделить памяти

а тут посему ошибка
на строке
p=&d2;
приведение типов: преобразование "derived2 *" в "base *" существует, но недоступно
из за
class derived2rivate base{
private же делает ограничение на методы, те что в базовом классе были public, тут станут private как я понимаю, а почему ограничение на взятие адреса объекта??

Код:
#include <iostream>
using namespace std;

class base{
public:
    virtual void vfunc(){
        cout << "function classa base" << endl;
    }
};

class derived1:public base{
public:
    void vfunc(){
        cout << "function classa derived1" << endl;
    }
};

class derived2:private base{
    void vfunc(){
        cout << "function classa derived2" << endl;
    }
};


int main(){
    base* p;
    base b;
    derived1 d1;
    derived2 d2;

    p=&b;
    p->vfunc();

    p=&d1;
    p->vfunc();

    p=&d2;
    p->vfunc();

    char ch = getchar();
    return 0;

}

Последний раз редактировалось zla9_kolu4ka; 09.03.2014 в 00:53.
zla9_kolu4ka вне форума Ответить с цитированием
Старый 09.03.2014, 03:16   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

(15): error C2079: "d2" использует неопределенный class "derived2"
посему??

В третьей строке вы используете предварительное объявление типа:
Код:
class derived2;
Это сообщает компилятору о том, что такой класс существует, и будет объявлен позже.

Далее, в 15 строке создается переменная этого класса:

Код:
class derived1:public base{
public:
void vfunc(){
cout << "function classa derived1" << endl;
derived2 d2;   <-------  вот тут
derived2* p1;
p1=&d2;
p1->vfunc();
}
};
Однако класс derived2 ещё не был объявлен. В этой точке компилятор по прежнему не знает, что это за класс.

Он не может создать переменную класса, который ещё не был объявлен.
О чем и сообщает вам на чистом русском:
'error C2079: "d2" использует неопределенный class "derived2"'

Последний раз редактировалось _Bers; 09.03.2014 в 03:19.
_Bers вне форума Ответить с цитированием
Старый 09.03.2014, 03:19   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

private же делает ограничение на методы, те что в базовом классе были public, тут станут private как я понимаю, а почему ограничение на взятие адреса объекта??

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

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

О чем вам и сообщает компилятор на чистом русском:
'приведение типов: преобразование "derived2 *" в "base *" существует, но недоступно'
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
виртуальные функции mixon-21 Помощь студентам 1 19.09.2013 21:56
Виртуальные функции studprog Помощь студентам 2 30.09.2012 21:00
C++ виртуальные функции iKarma Помощь студентам 2 28.11.2011 10:50
виртуальные функции vanek1 Помощь студентам 1 08.06.2011 17:49
Виртуальные функции bigory Помощь студентам 2 06.06.2009 22:44