Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
0 / 0 / 1
Регистрация: 10.10.2009
Сообщений: 52
1

Перекрытие виртуальной функции

06.06.2010, 19:39. Показов 4061. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите пожалуйста, что означает - перекрыть виртуальную функцию или зделать её терминальной?
И ещё одно, как привести виртуальную функцию к не переопределённому виду, и что это вообще означает??
Зарание спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.06.2010, 19:39
Ответы с готовыми решениями:

Перекрытие виртуальной функции базового класса
Возникла проблема с перекрытием виртуальной функции базового класса. Изначально все было всё в 1...

Перекрытие функции
// Header.cpp #include "Header.h" #include <iostream> void setgolf(golf &g, const char *name,...

Организация виртуальной функции
Уже выполненное задание: Дан класс: class Base { public: virtual void myname() { cout <<...

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

10
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
06.06.2010, 20:55 2
"Перекрытие" виртуальной функции происходит по умолчанию при определении в потомке функции с тем же именем, но другой сигнатурой.
Терминальной виртуальной функцией могла бы называться такая функция, которую запрещено переопределять в потомках, или функция класса, от которого запрещено наследование. В С++ нет средств ни для того, ни для другого (хотя аналог терминального класса можно получить скрытием конструкторов).
"Приведение виртуальной функции к непереопределённому виду" выглядит для меня не имеющим смысла сочетанием слов. Хотя, может быть, имеется в виду явно указанный вызов функции предка в таком стиле:
C++
1
2
3
4
5
6
7
8
9
10
class Base {public: virtual void Foo() const {std::cout<<"Base"<<std::endl;}};
class Derived: public Base {public:virtual void Foo() const {std::cout<<"Derived"<<std::endl;}};
 
void Bar()
{
    Base *b = new Derived();
    b->Foo();    // Напечатает Derived
    b->Base::Foo();    // Напечатает Base
    delete b;
}
1
0 / 0 / 1
Регистрация: 10.10.2009
Сообщений: 52
06.06.2010, 22:43  [ТС] 3
Спасибо, но мне уже вообщем помогли.
Есть в базовом классе вирт. метод virtual int fnew(int a), если к нему дописать "sealed"(virtual int fnew(int a) sealed) то переопределить его в потомках будет не возможно.
0
537 / 459 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
07.06.2010, 18:14 4
Ты что-то путаешь. Может в с#. В с++ нет ключевого слова "sealed".
0
0 / 0 / 1
Регистрация: 10.10.2009
Сообщений: 52
08.06.2010, 18:18  [ТС] 5
Цитата Сообщение от Airhand Посмотреть сообщение
Ты что-то путаешь. Может в с#. В с++ нет ключевого слова "sealed".
В Visual C++ для ссылочных классов - есть. Есть и override и new.
0
537 / 459 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
08.06.2010, 18:54 6
Это шарп. В стандарте с++ нет ключевых слов "override", "sealed".
0
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
08.06.2010, 19:11 7
Не все то visual C++, что пишется в Visual Studio(sealed - C#)
0
4337 / 1506 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
08.06.2010, 19:50 8
Airhand,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public ref class Base abstract
{
public:
    virtual void Foo() sealed
    {
    }
    virtual void Bar() abstract;
    virtual void Bar2() abstract;
};
 
public ref class Derived : public Base
{
public:
    virtual void Foo() override // ошибка компиляции
    {        
    }
    virtual void Bar() override
    {
    }
    virtual void Bar2() new
    {
    }
};
0
537 / 459 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
08.06.2010, 22:38 9
Цитата Сообщение от HIMen Посмотреть сообщение
Airhand,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public ref class Base abstract
{
public:
    virtual void Foo() sealed
    {
    }
    virtual void Bar() abstract;
    virtual void Bar2() abstract;
};
 
public ref class Derived : public Base
{
public:
    virtual void Foo() override // ошибка компиляции
    {        
    }
    virtual void Bar() override
    {
    }
    virtual void Bar2() new
    {
    }
};
Я что утверждал что-то обратное ? Я же говорил, что в стадарте НЕТ таких ключевых слов.
0
4337 / 1506 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
08.06.2010, 22:43 10
Цитата Сообщение от Airhand Посмотреть сообщение
Я же говорил, что в стадарте НЕТ таких ключевых слов
Стандарт ECMA-372. Стандарт того, что все зовут visual c++
0
537 / 459 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
08.06.2010, 22:49 11
Цитата Сообщение от HIMen Посмотреть сообщение
Стандарт ECMA-372. Стандарт того, что все зовут visual c++
Что такое ECMA - я не знаю. Зато все знают, что стандарт пишется ANSI и существует 3 стандарт C++ и черновик (если уже не приняли) 4 стандарта.
0
08.06.2010, 22:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.06.2010, 22:49
Помогаю со студенческими работами здесь

Переопределение виртуальной функции
Всем доброй ночи :) Есть базовый абстрактный класс и два производных класса (А и В), в которых я...

Вызов виртуальной функции
Здравствуйте, есть код: #include &lt;iostream&gt; using namespace std; class A{ public: virtual...

Смысл виртуальной функции?
Добрый день, вопрос состоит в следующем, какой вообще смысл иметь виртуальную функцию? ну точней,...

Создание виртуальной функции
Создать родительский класс TPrinter и виртуальную функцию ShowConf (), которая выводит информацию...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru