Форум программистов, компьютерный форум CyberForum.ru

Исключение для чисто виртуальной функции - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Странное поведение при переопределении operator++ http://www.cyberforum.ru/cpp-beginners/thread942482.html
Всем привет! Изучая переопределения в С++ наткнулся на следующую непонятку: #include <iostream> using namespace std; class Car { int * itsage; public:
C++ Как написать максимально оптимизированную функцию поиска длинны строки? Мысль о максимально оптимизированной функции длинны строки, где строка это указатель на литерал типа char. Не будем использовать не std::string, не std::wstring, не wchar_t в функцию передается указатель на строку, вот тело: int main() { char * str= "hello world"; int v = length(str); std::cout << v << std::endl; std::cin.get(); } http://www.cyberforum.ru/cpp-beginners/thread942451.html
C++ Создание .exe
Здравствуйте, я лишь неделю в программировании пытаюсь разбираться и соответственно вопросы мои могут показаться глупыми. Но столкнулся с проблемой что в Dev C++ что в NetBeans IDE при компеляции не создается файл exe. При чем если написать простую программку в стиле: #include <cstdlib> #include <iostream> #include <string> #include <ctime> #include <iomanip> using namespace std;
битовые операции C++
как из 0001 0000 тоесть в dec '8' сделать 0000 0001 в dec '1'?
C++ Вывод значений вектора на экран http://www.cyberforum.ru/cpp-beginners/thread942415.html
есть правильно заполненный вектор: vector<Employee*> emp; один из экземпляров: Bytime bt1("Ahmed", 2, 6.0); необходимо вывести три последние значения ID (второй параметр)на экран. Написал функцию в родительском классе:
C++ Post запрос 1) Здравствуйте, в общем я пытаюсь написать программу для одного сайта, все получается авторизация готова, но делаю 1 функцию не могу понять откуда берется 1 переменная в пост date. Я через сниффер смотрю, ну вы понимаете. И вот значение этой переменной я не могу уловить откуда оно берется. Есть ли у вас какие-то соображения. 2) И еще я работаю без куки, может ли это значение браться из куки ? подробнее

Показать сообщение отдельно
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
25.08.2013, 23:33  [ТС]     Исключение для чисто виртуальной функции
Цитата Сообщение от ForEveR Посмотреть сообщение
ArkTaS, Наследуются все. Однако к приватным/защищенным нет доступа извне
Еще, хочу что бы вы оценили правильность моего восприятия виртуальности. В большинстве встречаемых мною источников сказано что выбор метода в случае если он не виртуальный соответствует типу указателя, если метод виртуальный то компилятор выбирает в зависимости от типа объекта на который указывает указатель. Вопросов может не возникнуть пока не дойдешь до изучения RTTI. Для себя я все представляю вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class base;
{
public:
    virtual void func() { cout<<endl<<" base func()"; } 
};
 
class derv: public base
{
public:
   virtual void func() { cout<<endl<<" derv func()";   } 
};
-||-
base* ptrB=new derv;
ptrB->func();
Компилятор связывает указатель ptrB с base частью derv объекта. Если бы была возможность выполнить команду ptrB->derv::func() компилятор выдал бы класс base не содержит члена derv::func(). Но время выполнения ptrB->func(); произойдет обращение к таблице виртуальных функций из которой будет выбрана соответствующая функция в зависимости от типа объекта. Выводы сделаны на основе реальной ошибки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 class A
{
public:
    A(){std::cout << " Aconstr " << std::endl;}
 
};
  
class C : public A
{
public:
 
    C(){std::cout << " Cconstr " << std::endl;}
 
    void func(){std::cout << " C fucn " << std::endl;}
 
};
int main()
{
    A* a = new C();
 
        a->func(); // Класс А не содержит члена func
    system("pause");
    std::cout<<std::endl;
}
В следующем коде компилятор обрезает объект класса derv и оставляет только его base часть и статически связывает вызов функции fucn() с объектом типа base.
C++
1
2
3
4
base B;
derv D;
B=D
B.func()
В отличии от предыдущего кода ситуацию с объектом (*ptrB) можно исправить и "вернуть ему его derv часть"
C++
1
2
3
4
5
.............................
base* ptrB=new derv;
ptrB->func();  
 
derv* ptrD=dynamic_cast<derv*>(ptrB)
Адрес перемещен из ptrB в ptrD и теперь он указывает на обе составляющие объекта.
Прошу уделить особое внимание выделенному жирным шрифтом.
 
Текущее время: 13:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru