Если вы используете приведение в стиле C для преобразования в Alpha*
, аналогично static_cast перед использованием динамического приведения, то динамическое приведение не дает никакого эффекта. здесь ваш код выполняется, потому что оба класса имеют одинаковый интерфейс, но в действительности это неопределенное поведение.
Обычно вы хотите использовать динамическое приведение к восходящему / нисходящему из / в базовый класс в / из его производного класса.
Например, если мы добавим базовый интерфейс, затем преобразуем указатель void *
в этот базовый класс, а затем используем динамическое приведение, чтобы выполнить преобразование, код работает как положено и печатается только один раз. ]
#include <stdio.h>
class Speaker {
public:
virtual void Speak() = 0;
};
class Alpha: public Speaker {
public:
virtual void Speak() { printf("A"); }
};
class Beta: public Speaker {
public:
virtual void Speak() { printf("B"); }
};
int main(){
void *p = new Alpha;
// Convert to base type, using static_cast
Speaker *s = static_cast<Speaker *>(p);
// Attempt Upcasts
Alpha*a = dynamic_cast<Alpha*>(s);
Beta*b = dynamic_cast<Beta*>(s);
// See if it worked
if (a)
a->Speak();
if (b)
b->Speak();
return 0;
}
Выходы: A
URL main = Main.class.getResource("Main.class");
if (!"file".equalsIgnoreCase(main.getProtocol()))
throw new IllegalStateException("Main class is not stored in a file.");
File path = new File(main.getPath());
Обратите внимание, что большинство файлов классов собраны в файлы JAR, поэтому не будет работать в каждом случае (отсюда IllegalStateException
). Тем не менее, вы можете найти JAR, который содержит класс с помощью этого метода, и вы можете получить содержимое файла класса, подставив вызов getResourceAsStream ()
вместо getResource ()
,
Согласно http://www.cs.caltech.edu/courses/cs11/material/java/donnie/java-main.html , №. Тем не менее, я предлагаю прочитать $ 0 (имя программы) на Java? Откройте для себя основной класс? , который, по крайней мере, дает вам основной класс.
Для чего вам это нужно? Если вам это нужно, чтобы получить какие-либо файлы, находящиеся в том же каталоге, то для этого Class.getResourceAsStream () .
Для меня это больше похоже на проблему конечного пользователя. Также учтите возможную необходимость запуска нескольких экземпляров любого данного приложения, и предотвращение этого для пользователей станет серьезным раздражением.
Если проблема связана с конфликтами временных файлов, просто убедитесь, что все ваши временные файлы имеют уникальные имена. Насколько я понимаю, это наиболее распространенная причина, по которой люди чувствуют необходимость предотвратить запуск нескольких экземпляров своих приложений.
PS: Методы java.io.File.createTempFile () идеально подходят для предотвращения временных конфликтов файлов. потому что они автоматически генерируют уникальные имена файлов.