powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Virtual method + Exceptions in C++
25 сообщений из 83, страница 3 из 4
Virtual method + Exceptions in C++
    #39649376
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivТак я же знаю.Иллюзия знания хуже, чем отсутствие знаний.Там все методы виртуальные.Цитирую избранные места JLS6 (выделено мною):
8.4.3.2 static MethodsA method that is declared static is called a class method.
A class method is always invoked without reference to a particular object .
8.4.3.3 final MethodsA method can be declared final to prevent subclasses from overriding or hiding it.
It is a compile-time error to attempt to override or hide a final method .
A private method and all methods declared immediately within a final class (§8.1.1.2) behave as if they are final, since it is impossible to override them.
It is a compile-time error for a final method to be declared abstract.
At run time, a machine-code generator or optimizer can "inline" the body of a final method, replacing an invocation of the method with the code in its body.
Вроде, должно быть очевидным, что метод, который или вызывается без ссылки на объект или который нельзя перекрыть или переопределить в классе-наследнике, не может быть виртуальным.
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649380
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

Ой. всё.

А функции в языке Fortran ты не хочешь рассмотреть на предмет их виртуальности в данном контексте?
Или скажем функции WinAPI...
Вот функции WinAPI -- они виртуальные или нет ?

А функции (процедуры) FORTRAN?
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649385
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivА функции в языке FortranЯ не лезу туда, где не понимаю.
Исходное утверждение было сделано о виртуальности всех функций во вполне конкретном языке.
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649387
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovMasterZivА функции в языке FortranЯ не лезу туда, где не понимаю.
Исходное утверждение было сделано о виртуальности всех функций во вполне конкретном языке.

Ну методов же.
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649391
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да-да, к пуговицам претензий нет.
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649457
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovВ Java, невиртуальным является любой метод с модификаторами private или final. Просто по определению.
Вот, B::test() - final, а значит не виртуальный (просто по определению)
Вопрос: что напечатает программа?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class A {
    void test()
    {
        System.out.println("A");
    }
}

public class B extends A {
    final void test()
    {
        System.out.println("B");
    }
}

A a = new B();
a.test();
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649467
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
class Test{
  public static class Main
  {
    public static void main(String[] args)
    {
    	A v;
    	v = new B();  v.msg();
    	v = new A();  v.msg();
    }
  }
  
  static class A
  {
  	static void msg() { System.out.println("A class");}
  }
  
  static class B extends A
  {
  	static void msg() { System.out.println("B class"); }
  } 
}

java Test$Main
Код: plaintext
1.
 A class
 A class
Отсюда мораль: не вызывайте статические методы через переменные - (рано или поздно) запутаетесь в типах.
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649475
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovстатические методы
А про final что? )))
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649477
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы уж совсем без вопросов ...
Код: java
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.
26.
class Test
{
  public static class Main
  {
    public static void main(String[] args)
    {
    	A v;
    	v = new B();  v.msg();
    	v = new A();  v.msg();
    	v = null;
    	System.out.println("--");
    	A.msg();
    	B.msg();
    }
  }
  
  static class A
  {
  	static void msg() { System.out.println("A class");}
  }
  
  static class B extends A
  {
  	static void msg() { System.out.println("B class"); }
  } 
}

Код: plaintext
1.
2.
3.
4.
5.
 java -cp bin Test$Main
 A class
 A class
 --
 A class
 B class
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649483
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyА про final что? )))В смысле?
Модификатор final запрещает сокрытие и переопределение, поэтому в условиях примера будет ошибка компиляции.
С модификатором static (без final) - у предка и потомка есть разные, но одноимённые методы с одинаковыми сигнатурами.
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649497
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovМодификатор final запрещает сокрытие и переопределение, поэтому в условиях примера будет ошибка компиляции.
Не будет ошибки.
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649508
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНе будет ошибки.
Код: plaintext
1.
2.
3.
4.
src\.java:19: error: msg() in B cannot override msg() in A
        final static void msg() { System.out.println("B class"); }
                          ^
  overridden method is static,final
1 error
.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
class Test
{
  public static class Main
  {
    public static void main(String[] args)
    {
    	A.msg();
    	B.msg();
    }
  }
  
  static class A
  {
  	final static void msg() { System.out.println("A class");}
  }
  
  static class B extends A
  {
  	final static void msg() { System.out.println("B class"); }
  } 
}

...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649513
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

А можно все-таки мой пример, а не ваш проверять )))
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649536
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovsemen.s.semenВ гугле на ряде проектов строго требуется неиспользовать исключения и уходить от
виртуальных методов

Если в гугловском Го виртуальные методы и исключения невыносимо тормозят, то... это
проблема гугля.

Скорее всего у них там речь не про тормоза, а стоит некий автоматический проверяльщик хода выполнения кода. Они видимо не могут определить куда будет передано управление при вызове виртуальных функций и кидании эксепшенов.
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649554
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyА можно все-таки мой пример, а не ваш проверять )))А что, простите, проверять в вашем недооформленном примере:
javap -c Test
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 public class Test {
   public Test();
     Code:
        0: aload_0
        1: invokespecial #1                  // Method java/lang/Object."<init>":()V
        4: return

   public static void main(java.lang.String[]) throws java.io.IOException;
     Code:
        0: new           #2                  // class B
        3: dup
        4: invokespecial #3                  // Method B."<init>":()V
        7: astore_1
        8: aload_1
       9: invokevirtual #4                  // Method A.test:()V
       12: return
}
?
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649559
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invokevirtual для вызова final метода, который якобы невиртуальный.
Чудеса ))
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649560
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskyinvokevirtual для вызова final метода, который якобы невиртуальный.
Чудеса ))Я неправ в отношении final, но вы иллюстрируете мою ошибку неверным примером.
Из байт-кода, который генерирует javac видно, что вызов делается по объявленному типу переменной, а созданный вами финальный метод - вообще не участвует.
Это первое.

Второе.
Что останется от виртуальности в процессе исполнения - неизвестно.
Это уже несколько более другой инструментарий, но, насколько я понимаю, ситуации вполне тривиальная для оптимизации и никаких эвристик не требует.
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649561
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovИз байт-кода, который генерирует javac видно, что вызов делается по объявленному типу переменной, а созданный вами финальный метод - вообще не участвует.
Как же не участвует? Что выводит программа?))
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649565
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
порезано цензурой ...
Спать-гулять надо: и думаю плохо и и какие-то тупые ошибки делаю.
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649567
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
готово к употреблению без применения напильника
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
// Test.java
public class Test {
  public static void main(String[] args) throws java.io.IOException
  {
    A v = new B();
    v.msg();
  }
}

class A
{
  void msg() { System.out.println("A class"); }
}

class B extends A
{
  @Override
  final void msg() { System.out.println("B class"); }
}

...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649571
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
готово к употреблению без применения напильника
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
// Test.java
public class Test {
  public static void main(String[] args) throws java.io.IOException
  {
    A v = new B();
    v.msg();
  }
}

class A
{
  void msg() { System.out.println("A class"); }
}

class B extends A
{
  @Override
  final void msg() { System.out.println("B class"); }
}



И что сие доказывает ?

Что в java все нестатические методы виртуальные ?
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649573
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.semenЧто в java все нестатические методы виртуальные ?В байт-коде для финального метода делается invokevirtual "на общих основаниях".
Что будет в процессе исполнения - надо смотреть отдельно, но уже сложнее.
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649575
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovsemen.s.semenЧто в java все нестатические методы виртуальные ?В байт-коде для финального метода делается invokevirtual "на общих основаниях".
Что будет в процессе исполнения - надо смотреть отдельно, но уже сложнее.

В любом случае это будет поведение виртуального метода
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649577
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.semenВ любом случае это будет поведение виртуального методаСреда исполнения может и девиртуализировать и встроить вызов финального метода.
Это предусмотрено уже в JLS.
...
Рейтинг: 0 / 0
Virtual method + Exceptions in C++
    #39649578
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovsemen.s.semenВ любом случае это будет поведение виртуального методаСреда исполнения может и девиртуализировать и встроить вызов финального метода.
Это предусмотрено уже в JLS.

Как там среда себя не вела - вызван будет метод ребенка
...
Рейтинг: 0 / 0
25 сообщений из 83, страница 3 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / Virtual method + Exceptions in C++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]