Наследование перегруженных методов в Java и C ++ чем принципиально отличаются? - PullRequest
1 голос
/ 14 ноября 2011

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

"Наследование перегруженных методов в Java и C ++ существенно отличаются друг от друга. Четко покажите разницу в двух принятых подходах и расскажите, почему проектное решение Java предпочтительнее."

Единственная идея, которая у меня возникла по этому вопросу, - это память о перегрузке оператора Java и о том, как вы не можете этого сделать, но в C ++ вы можете.

Ответы [ 3 ]

3 голосов
/ 14 ноября 2011

Я бы попросил лектора привести пример иерархии наследования, который демонстрирует «наследование перегруженных методов». Я хотел бы, чтобы это означало что-то вроде следующего в C ++:

struct A1 { };
struct A2 { };

struct B1 {
    virtual void f(A1*) = 0;
};

struct B2 {
    virtual void f(A2*) = 0;
};

struct D : B1, B2 { };

void f(D& d)
{
    A1 a1;
    A2 a2;
    d.f(&a1);
    d.f(&a2);
}

И следующее на Java (моя Java немного грубовата, поэтому я надеюсь, что понял правильно):

class M {
    class A1 { };
    class A2 { };

    interface B1 {
        void f(A1 a1);
    };
    interface B2 {
        void f(A2 a2);
    };

    abstract class D implements B1, B2 {
    }; 

    void f(D d)
    {
        A1 a1 = new A1();
        A2 a2 = new A2();
        d.f(a1);
        d.f(a2);
    }
};

Обратите внимание, что разница здесь в том, что код C ++ не будет компилироваться, потому что f () неоднозначно. Тогда как код Java будет компилироваться. Если это то, о чем они говорят, вы можете утверждать, что Java делает то, что ожидает программист, тогда как C ++ может удивить программиста. Одна важная вещь, которую я узнал в Uni, состоит в том, что прохождение курсов Uni по программированию иногда означает отвечать на вопросы так, как эксперт ожидает от вас первого и правильно второго.

3 голосов
/ 14 ноября 2011

кажется, что большинство ответов здесь говорят о наследовании и методе "Переопределение" в C ++ / Java.

Однако в этом вопросе есть ключевое слово, которое заставляет меня думать, что он на самом деле просит другую вещь: «Наследование перегруженных методов»

Есть одно фундаментальное отличие, если я правильно помню, в отношении наследования + перегрузки метода:

В C ++, если вы перегружаете метод в дочернем классе, который объявлен в родительском классе, это вызовет теневое копирование метода. Это может вызвать некоторые неожиданности в вашем дизайне, если вы не знаете об этом. Если я правильно помню, если у родительского класса есть 2 метода перегрузки, а в дочернем классе вы переопределите один из них, он все равно вызовет затенение.

Однако в Java все нормально.

Если это действительно то, что запрашивается, то, честно говоря, путь Java предпочтительнее, поскольку перегрузка метода не должна мешать наследованию и переопределению метода. И такое затенение вызывает много проблем проектирования, например, вы не сможете получить доступ к методу родительского класса напрямую в сценарии перегрузки + наследования + затенения.

0 голосов
/ 14 ноября 2011

Наследование перегруженных методов в Java и C ++ принципиально отличается.

  1. В Java, когда базовый class метод переопределяется производным class,они оба связаны полиморфным способом по умолчанию.В C ++ вы должны сделать метод base как virtual
  2. В Java вы можете остановить переопределение метода, сделав его final.В текущем C ++, который не доступен

утверждает, почему дизайнерское решение Java является предпочтительным.

Это спорно.Java обеспечивает единый способ проектирования, который помогает программистам понимать код лучше / быстрее.Также уменьшает путаницу и использование языковых возможностей.

C ++ поддерживает мультипарадигму и плату за использование терминологию, которая обеспечивает гибкость, но также делает ее ориентированным на экспертов языком.

...