Изменение владения моему пользователю работало на меня.
Есть событие Application.ApplicationExit , если у вас есть приложение WinForms. Для WPF есть Application.Exit .
Эта функция из базы с этого момента становится виртуальной, когда происходит из нее, что означает, что вам не нужно «виртуальная» для повторно реализованных вызовов виртуальных функций. Если сигнатура функции в базовом классе не виртуальная, а виртуальная в производных классах, то базовый класс не имеет полиморфного поведения.class Base
{
public:
void func(void){ printf("foo\n"); }
};
class Derived1 : public Base
{
public:
virtual void func(){ printf("bar\n"); }
};
class Derived2 : public Derived1
{
public:
/* reimplement func(), no need for 'virtual' keyword
because Derived1::func is already virtual */
void func(){ printf("baz\n"); }
};
int main()
{
Base* b = new Derived1;
Derived1* d = new Derived2;
b->func(); //prints foo - not polymorphic
d->func(); //prints baz - polymorphic
}
после того, как функция сделана виртуальной в базовом классе, она станет виртуальной для всех остальных подклассов.
открытый, защищенный и частный не влияют на виртуальную природу функций.
Если Вы удалите virtual
из определения myfunction
в классе B, компилятор
добавит это для Вас. Чтобы заполнить V-таблицу для полиморфных типов.
!! НО !!
У вас будет доступ только к публичным членам класса A (class B: public A)
определение:
class B: private A
{
}
Будет вызывать что все (даже открытые) члены класса A станут закрытыми для класса B. Упрощает. У вас не будет доступа к публичным членам A.
Временное решение Вы можете объявить друга:
class A
{
private:
friend class B;
}
Дополнительная информация ЗДЕСЬ .
Поведение virtual
заключается в том, что он влияет на то, какой метод вызывается, когда у вас есть указатель одного типа, который указывает на объект подтипа. Например:
B* obj = new B;
A* base = obj;
Что происходит, когда вы вызываете obj-> myfunction ()
, зависит от того, объявляет ли A
виртуальным myfunction
. Если он не виртуальный, причина такова: у нас есть указатель типа A
, поэтому мы вызываем функцию, определенную в A
, и результат равен 1. Если A
определяет myfunction
как виртуальную, однако поиск выполняется во время выполнения на основе типа фактического объекта, а не типа указателя; поскольку объект на самом деле является B
, используется реализация, определенная в B
, и результат равен 2.