Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обеспечение полиморфизма при множ.наследовании, не получается преобразовать указатель 
V
    Опции темы
zim22
Дата 9.4.2009, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Вот структура классов:
Код
class X {
public:
  X() { std::cout << "X()" << std::endl; }
};
class A {  
  public:
  A() { std::cout << "A()" << std::endl; }
};
class B : public A {  
  public:
  B() { std::cout << "B()" << std::endl; }
};
class C : private B { 
  public:
  C() { std::cout << "C()" << std::endl; }
};

class D : public X, public C { 
  public:
  D() { std::cout << "D()" << std::endl; }
};



Почему не компилятся закомментированные строки? Потому что мы явно не наследуемся от этих классов?
Код
D *pd = new D;
  X* px = pd;
  //A *pa = pd;
  //B *pb = pd;
  C *pc = pd;


если изменить private на public, то заработает:
Код
class C : public B { 



Аналогичный код работает:
Код
class Foo { };
class Bar : public Foo { };
class FooBar : public Bar { };
...
Foo* f = new FooBar;


Это сообщение отредактировал(а) zim22 - 9.4.2009, 11:09


--------------------
PM MAIL   Вверх
azesmcar
Дата 9.4.2009, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



zim22

ошибка явно обо всем рассказывает
Цитата

'type cast' : conversion from 'D *' to 'A *' exists, but is inaccessible


потому что у тебя приватное наследование, сделаем пример немного проще
Код

class A {  
public:
    A() { std::cout << "A()" << std::endl; }
};
class B : private A {  
public:
    B() { std::cout << "B()" << std::endl; }
};

int main()
{
    A *pd = new B;
}

тут будет тоже самое
PM   Вверх
zim22
Дата 9.4.2009, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(azesmcar @  9.4.2009,  11:22 Найти цитируемый пост)
тут будет тоже самое

я не понимаю, почему нельзя указатель на объект B нельзя присвоить объекту А? Ведь он его базовый класс. А указатели на базовый класс можно использовать для объектов производных классов.

Код
#include <iostream>

class A {  
public:
    A() { std::cout << "A()" << std::endl; }
};
class B : private A {  
public:
    B() { A(); std::cout << "B()" << std::endl; }
};

int main()
{
  B b;
  A *pd = new B;
}




--------------------
PM MAIL   Вверх
azesmcar
Дата 9.4.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



zim22
можно, но в случае открытого наследования. В случае закрытого - тоже можно, но cast недоступен..

Код

class A {  
public:
    A() { std::cout << "A()" << std::endl; }
};
class B : private A {  
public:
    friend int main();
    B() { std::cout << "B()" << std::endl; }
};

int main()
{
    A *pd = new B;
}



вот так попробуй
PM   Вверх
zim22
Дата 9.4.2009, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



azesmcar, супер! спасибо  smile

Добавлено @ 11:41
Цитата(azesmcar @  9.4.2009,  11:37 Найти цитируемый пост)
friend int main();

по мне, так это извращение функцию main делать дружественной smile

это что-то из той же оперы: не 
Код

std::string x;
std::cin >> x;

а
Код

operator>>(std::cin, x);



Это сообщение отредактировал(а) zim22 - 9.4.2009, 11:44


--------------------
PM MAIL   Вверх
Fazil6
Дата 9.4.2009, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(zim22 @  9.4.2009,  11:28 Найти цитируемый пост)
я не понимаю, почему нельзя указатель на объект B нельзя присвоить объекту А? Ведь он его базовый класс. А указатели на базовый класс можно использовать для объектов производных классов.

не так. Это справедливо только для открытого наследования. При других видах наследования ты не наследуешь интерфейс. Значит не можешь из интерфейса объекта-потомка вызывать функции интерфейса родителя. 
Сам подумай - это же очевидно, что в таком случае потомок никак не является родителем ибо у него совершенно другой интерфейс.
PM MAIL   Вверх
azesmcar
Дата 9.4.2009, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата

по мне, так это извращение функцию main делать дружественной smile


а я и не пропогандировал такой метод smile зачем использовать закрытое наследование если потом обявлять друзей? Закрытое наследование нужно в основном если не хочешь наследовать интерфейс а просто использовать некоторую функциональность...но и в этом случае я предпочитаю композицию.

Это сообщение отредактировал(а) azesmcar - 9.4.2009, 11:50
PM   Вверх
zim22
Дата 9.4.2009, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Fazil6 @  9.4.2009,  11:43 Найти цитируемый пост)
Сам подумай - это же очевидно, что в таком случае потомок никак не является родителем ибо у него совершенно другой интерфейс.

подумал. действительно тупо. ведь фишка в том, чтобы из базового класса вызывать полиморфно методы из дочерних классов. А если интерфейс будет закрытым - то вызывать нечего будет.


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0498 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.