Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Порядок построения классов

Ответить
Настройки темы
C/C++ - Порядок построения классов
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Где можно почитать про порядок построения классов (с виртуальными функциями)? Пример:
Код: Выделить весь код
struct A
{
  virtual void foo() {cout << "A::foo()\n";}
}

struct C
{
  C(A& a) {a.foo();}
}

struct B : A, C
{
  B() : A(), C(*this)
  {
  }

  void foo() {cout << "B::foo()\n";}
}
что по правилам должно появиться на экране, A::foo(), B::foo() или какая-нить ошибка, что класс недостроен?

Отправлено: 09:20, 18-03-2009

 

Аватара для Alan85

Забанен


Сообщения: 463
Благодарности: 91

Профиль | Цитировать


Цитата pva:
virtual void foo() {cout << "A::foo()\n";} »
может я чтото уже подзабыл из классов си++ но член класса объявленый виртуальным не может иметь реализацию тут же.
и объявление класса должно быть начинатся с class <name> . Почитать можно в любой более менее нормальной книге по Си++ . Ну а про классы в своей библиотеке нашел "Павловская Т. C++ Объектно-ориентировочное программирование. Практикум"
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:16, 18-03-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата Alan85:
не может иметь реализацию тут же »
Почему нет? классический пример из книги страуструпа:
Код: Выделить весь код
class shape_t
{
public:
   virtual ~shape_t() {}
}
Методы, реализованные в описании раскрываются inline когда могут (если не могут, то не inline)
Цитата Alan85:
должно быть начинатся с class <name> »
struct - это тоже класс (любой тип данных есть класс для C++)
Цитата Alan85:
Павловская Т. C++ Объектно-ориентировочное программирование. Практикум »
Есть ссылка на "скачать в интернете"?

Отправлено: 07:34, 19-03-2009 | #3


Аватара для Alan85

Забанен


Сообщения: 463
Благодарности: 91

Профиль | Цитировать


Цитата pva:
struct »
не есть истинный класс - в нем нет такой фишки как private.
Где скачать не знаю, я двд с книгами заказал - куча чего полезного и интересного.

Отправлено: 08:36, 19-03-2009 | #4

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата Alan85:
фишки как private. »
не верю:
Код: Выделить весь код
struct A
{
private:
   int _priv_data;
};
вполне собирается любым компилятором C++. Ссылку на книжку не пока могу дать
Более того, даже int есть класс, а у него даже и методов то нет...

Отправлено: 10:18, 19-03-2009 | #5


Аватара для Alan85

Забанен


Сообщения: 463
Благодарности: 91

Профиль | Цитировать


да, извини, согласен - давно классами в сях не баловался. А верхний пример будет откомпилирован и выведет A::foo(), B::foo() если немного подправить синтаксис (точки с запетой между реализациями). Только хоть используй virtual тут хоть нет - результат тот же.
Код: Выделить весь код
#include <iostream>
using namespace std;
class A
{
  public:
  void foo() {cout << "A::foo()\n";}
}    ;
class  C
{
 public:
  C(A& a) {a.foo();}
}   ;

class B : A, C
{
 public:
  B() : A(), C(*this){/**/}
  void foo() {cout << "B::foo()\n";}
}  ;
main()
{
  B b;
  b.foo();
  cin.get();
}

Отправлено: 19:25, 19-03-2009 | #6


Аватара для Alan85

Забанен


Сообщения: 463
Благодарности: 91

Профиль | Цитировать


Код: Выделить весь код
#include <iostream>
using namespace std;
class A
{
  public:
  virtual void foo() {cout << "A::foo()\n";}
}    ;
class  C
{
 public:
  C(A& a) {a.foo();}
}   ;

class B : public A
{
 public:
  void foo() {cout << "B::foo()\n";}
}  ;
main()
{
  B* b=new B();
  A *a=b;
  a->foo();
  b->foo();
  cin.get();
}
а тут слово virtual имеет значение. Тут типичный случай полиморфизма - объект A подменяет свои виртуальные функции функциями из объекта B.

Отправлено: 19:50, 19-03-2009 | #7

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата Alan85:
Только хоть используй virtual тут хоть нет - результат тот же. »
вот пример когда есть отличия:
Код: Выделить весь код
#include <iostream>
using namespace std;
class A
{
  public:
  void foo() {cout << "A::foo()\n";}
  // функция test_foo не знает, какой именно класс передан аргументом.
  // она просто получила некоторый интерфейс, одинаковый для всех наследников 
  friend test_foo(A& a) {a.foo();} 
}    ;
class  C
{
 public:
  C(A& a) {a.foo();}
}   ;

class B : A, C
{
 public:
  B() : A(), C(*this){/**/}
  void foo() {cout << "B::foo()\n";}
}  ;
main()
{
  A a;
  B b;
  test_foo(a); // вызов одной функции с разными реализациями foo()
  test_foo(b);
  cin.get();
}
Внимание вопрос! в классе B функция foo вызывается 2 раза. Каждый раз результаты разные.
Цитата Alan85:
a->foo();
b->foo(); »
Испльзования класса хранилища (auto или в свободной памяти) не влияет на правила полиморфизма и построения классов, поэтому через operator new() и указатели не было смысла переделывать
Цитата Alan85:
A подменяет свои виртуальные функции »
Это то понятно, это на случай, когда оно всё гладко. А вот рассмотрим случай использования недостроенного класса. Рассмотрим конструктор класса (пример сделан специально, чтобы достигнуть нужного эффекта)
Код: Выделить весь код
struct B : A, C
{
  // порядок вызова:
  // 1. A::A() 
  // 2 С::C(A&)   - подкласс A уже построен, но B:A,C ещё нет
  // 3 тело B::B()
  B() : A(), C(*this)
  {
  }

  void foo() {cout << "B::foo()\n";}
}
Верно ли, что по правилам C++ в случае использования недостроенного класса с виртуальными функциями будут использоваться реализации уже достроенных подклассов либо, в случае использования чистых виртуальных функций, выводится сообщение об ошибке на усмотрение компилятора (например обращение по адресу 0x00000000)
~либо~
Верно ли что использовать недостроенные классы категорически нельзя, реализация поведения остаётся на усмотрение компилятора.
Я ни того, ни другого утверждения ещё не встречал

Отправлено: 22:29, 20-03-2009 | #8


Аватара для Alan85

Забанен


Сообщения: 463
Благодарности: 91

Профиль | Цитировать


Цитата pva:
в случае использования недостроенного класса »
наверно ты имеешь ввиду абстрактный класс.
Код: Выделить весь код
 class A  //абстрактный
{
  public:
  virtual void foo()=0;
}    ;
То тогда вылетит со свистом так как в в конструкторе C(A& a) {a.foo();} передается B которое еще не создано (после C будет ) что значит B::foot() еще неизвестно (не построена таблица виртуальных функций).
Но стоит только заменить класс A обратно с реализацией функции (она сразу вносится в таблицу виртуальных функций) все отлично - C(A& a) {a.foo();} хоть и принимает B но в таблице не найдя для нее реализации B::foo() передает выше - A::foo().
Я не утверждаю что это истина и верно на всех компиляторах хотя логически должно.

Отправлено: 23:25, 20-03-2009 | #9

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата Alan85:
наверно ты имеешь ввиду абстрактный класс. »
Я имел ввиду именно НЕДОСТРОЕННЫЙ класс С РЕЛИЗАЦИЕЙ (когда непонятно, как должна себя вести софтина)

Отправлено: 17:44, 22-03-2009 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Порядок построения классов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Php. Поиск документации для начинающих по использованию классов. BarsMaster Вебмастеру 5 10-01-2007 21:44
[решено] Разукрашивание сайтов по-своему, подменой CSS и Классов hasherfrog Вебмастеру 16 20-10-2006 01:21
Не совсем стандартное решение построения LAN. LEXX2002 Сетевые технологии 4 14-03-2005 21:18
Reverse ingineering классов (обратно UML-диаграмме) djogik Программирование и базы данных 1 12-01-2005 21:29
Программа для построения графиков функций Sherla Программное обеспечение Windows 10 25-04-2004 19:20




 
Переход