Необходимость виртуальной функции-члена - PullRequest
1 голос
/ 19 декабря 2010

когда a имеют одинаковое имя функции в базовом классе и производный класс с различным кодом для каждой функции, необходимо ли устанавливать мою функцию как виртуальную или это просто часть лучшего программирования?

Ответы [ 5 ]

3 голосов
/ 19 декабря 2010

Нет необходимости делать метод виртуальным.Однако он должен быть виртуальным, если вы хотите, чтобы он вызывался через «позднее связывание», т. Е. Если, учитывая базовый указатель, вы хотите, чтобы производный метод вызывался.

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

0 голосов
/ 19 декабря 2010
class A {
public:
    void Foo() {}
    virtual void Bar() {}
};
class B : public A {
public:
    void Foo() {}
    virtual void Bar() {}
};

int main() {
    A *a = new A;
    B *b = new B;
    A *c = b;

    a->Foo();  // calls A::Foo on a
    b->Foo();  // calls B::Foo on b
    c->Foo();  // calls A::Foo on b

    a->Bar();  // calls A::Foo on a
    b->bar();  // calls B::Foo on b
    c->bar();  // calls B::Foo on b

    delete a;
    delete b;
}

См. Часто задаваемые вопросы C ++ § Наследование - virtual функции .

0 голосов
/ 19 декабря 2010

Нет, это не обязательно.

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

Смотрите здесь для получения дополнительной информации о функциях Virtual и Pure Virtual.

0 голосов
/ 19 декабря 2010

Если вы планируете использовать указатели базового класса на экземпляры производного класса, и функции имеют одинаковую сигнатуру, то вы, вероятно, захотите сделать функцию virtual, а также деструкторы класса virtual.Таким образом, если у кого-то есть указатель родительского класса на производный тип, и он хочет вызвать эту функцию, он, вероятно, захочет выполнить версию дочернего класса, если она отличается от версии родительского.

class Parent
{
public:
    virtual ~Parent() {}

    virtual void doSomething()
    {
        std::cout << "Parent";
    }
};

class Child : public Parent
{
public:
    virtual ~Child() {}

    virtual void doSomething()
    {
        std::cout << "Child";
    }
};

int main()
{
    Parent *p = new Child();
    p->doSomething(); // prints "Child" because of dynamic dispatch
}
0 голосов
/ 19 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...