Реализация Виртуальной функции C++?

Изменение владения моему пользователю работало на меня.

10
задан atp 5 November 2009 в 10:54
поделиться

4 ответа

Есть событие 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
}
18
ответ дан 3 December 2019 в 16:10
поделиться

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

открытый, защищенный и частный не влияют на виртуальную природу функций.

7
ответ дан 3 December 2019 в 16:10
поделиться

Если Вы удалите virtual из определения myfunction в классе B, компилятор

добавит это для Вас. Чтобы заполнить V-таблицу для полиморфных типов.

!! НО !!

У вас будет доступ только к публичным членам класса A (class B: public A)

определение:

class B: private A
{

}

Будет вызывать что все (даже открытые) члены класса A станут закрытыми для класса B. Упрощает. У вас не будет доступа к публичным членам A.

Временное решение Вы можете объявить друга:

class A
{
    private:
        friend class B;
}

Дополнительная информация ЗДЕСЬ .

1
ответ дан 3 December 2019 в 16:10
поделиться

Поведение virtual заключается в том, что он влияет на то, какой метод вызывается, когда у вас есть указатель одного типа, который указывает на объект подтипа. Например:

B* obj = new B;
A* base = obj;

Что происходит, когда вы вызываете obj-> myfunction () , зависит от того, объявляет ли A виртуальным myfunction . Если он не виртуальный, причина такова: у нас есть указатель типа A , поэтому мы вызываем функцию, определенную в A , и результат равен 1. Если A определяет myfunction как виртуальную, однако поиск выполняется во время выполнения на основе типа фактического объекта, а не типа указателя; поскольку объект на самом деле является B , используется реализация, определенная в B , и результат равен 2.

0
ответ дан 3 December 2019 в 16:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: