Мой способ иметь в виду оба ключевых слова, которые они противоположны друг другу.
override
: ключевое слово virtual
должно быть определено для переопределения метода. Метод, использующий ключевое слово override
, независимо от ссылочного типа (ссылка на базовый класс или производный класс), если он создается с базовым классом, выполняется метод базового класса. В противном случае используется метод производного класса.
new
: если ключевое слово используется методом, в отличие от ключевого слова override
, тип ссылки важен. Если он создается с производным классом, а ссылочный тип - это базовый класс, выполняется метод базового класса. Если он создается с производным классом, а ссылочный тип - это производный класс, выполняется метод производного класса. А именно, это отличие от ключевого слова override
. En passant, если вы забыли или опустите, чтобы добавить новое ключевое слово в метод, компилятор ведет себя по умолчанию при использовании ключевого слова new
.
class A
{
public string Foo()
{
return "A";
}
public virtual string Test()
{
return "base test";
}
}
class B: A
{
public new string Foo()
{
return "B";
}
}
class C: B
{
public string Foo()
{
return "C";
}
public override string Test() {
return "derived test";
}
}
Вызов в основном:
A AClass = new B();
Console.WriteLine(AClass.Foo());
B BClass = new B();
Console.WriteLine(BClass.Foo());
B BClassWithC = new C();
Console.WriteLine(BClassWithC.Foo());
Console.WriteLine(AClass.Test());
Console.WriteLine(BClassWithC.Test());
Выход:
A
B
B
base test
derived test
Печать адресов в большинстве реализаций C ++ подавляет ведущие нули, чтобы сделать вещи более читаемыми. 0x00000000000013fd
на самом деле не добавляет значения.
Когда вы задаетесь вопросом, почему вы обычно не видите ничего большего, чем 48-битные значения в пользовательском пространстве, это связано с тем, что существующая архитектура AMD64 имеет только 48 бит виртуальных адресное пространство (как можно видеть, например, cat /proc/cpuinfo
на linux)
Они там - они никуда не ушли - это просто форматирование в потоке.
EDIT: во-вторых, я не думаю, что есть хороший способ изменить форматирование по умолчанию operator<<
для указателей , Атрибуты fill и width могут быть изменены, если вы выполняете потоковое вещание с помощью манипулятора std::hex
.
Для удовольствия вы можете использовать вывод C и посмотреть, похоже ли это на то, что вам нужно:
printf("0x%p");