2016-07-01 4 views
-1

Вот стартовый код. Вопрос: Как бы вы определили ИЛИ сделать вызов метода из класса overcraft для производства BEEP!Множественное наследование в ориентированном объекте C++ C++ 11

class Vehicle { 
public: 
    virtual void honk() = 0; 
}; 

class Car : public Vehicle { 
public: 
    void honk() { cout << "Beep!"; } 
}; 

class Boat : public Vehicle { 
public: 
    void honk() { cout << "Toot!"; } 
}; 

class Hovercraft : public Car, public Boat { 
public: 
    // ... 
}; 

А вот потенциалы решения даны мне: (это может быть один для всех ответов возможных)

  1. Добавить использованием Судно на воздушной подушке :: автомобилей :: гудок; на глобальном уровне программы или в функции, в которой мы хотим позвонить

  2. добавить автомобиль Car :: honk; in Hovercraft класс

  3. добавить автомобиль Car :: honk(); в классе воздушных судов на воздушной подушке

  4. Автомобиль * c (новый Hovercraft()); C-> гудок(); delete c;

  5. Hovercraft h; h.Car::honk();

  6. Hovercraft h; Автомобиль :: h.honk();

  7. Там нет ничего, чтобы сделать, порядок наследования в любом случае автомобиль :: гудок() вызывается, когда мы сигналить() вызов из воздушной подушке

  8. Определить в Overcraft на гудок() метод, который называют автомобиль :: honk()

Для меня ... 3 и 6 являются ложными в любом случае. Я прав? Я бы выбрал 2 и 5, но когда я отправлю эти варианты, вопрос не удался. Я могу попробовать столько, сколько хочу, но я хотел бы лучше понять каждую комбинацию ...

Извините за ошибку перевода. Надеюсь, ты меня научишь.

+1

http://stackoverflow.com/questions/21558/in-c-what-is-a-virtual-base-class, возможно, это могло бы помочь. –

+3

Как насчет того, чтобы попробовать каждое предложение? Были ли те, которые вы выберете, должны вести себя по мере необходимости? Были ли те, которые вы бы не выбрали, не вели себя должным образом? Если вы не понимаете, почему какое-то конкретное решение ведет себя так, как показано на рисунке, то покажите нам полную программу, в которой используется решение, описывают поведение и какое поведение вы ожидали. – user2079303

+0

В дополнение к тем, которые вы заметили, есть еще один правильный вариант. (И это самый очевидный.) – molbdnilo

ответ

0

Вот мой код с моим тестам:

#include <iostream> 
#include <string> 
#include <vector> 

class Vehicle { 
public: 
    virtual void honk() = 0; 
}; 

class Car : public Vehicle { 
public: 
    void honk() { std::cout << "Beep!"; } 
}; 

class Boat : public Vehicle { 
public: 
    void honk() { std::cout << "Toot!"; } 
}; 

class Hovercraft : public Car, public Boat { 
public: 
// using Hovercraft::Car::honk; // work but is it the good place to identify answer 1? 
// using Car::honk; 
// using Car::honk(); // never put() here. 
    void honk() { Boat::honk(); } //tried with boat to identify behaviour 

}; 

int main() 
{ 
Hovercraft h; 
// Car::h.honk(); DOESNT WORK AS EXPECTED 
h.Car::honk(); // PRODUCE BEEP AS EXPECTED 
Car* c(new Hovercraft()); c->honk(); //PRODUCE BEEP ! but the delete c is not required (?) 
h.honk(); //PRODUCE A BEEP AS EXPECTED BECAUSE OF THE USING 
} 

Я попытался прокомментировать, насколько я могу. Если я отвечу разные ответы:

Добавить с помощью Hovercraft :: Car :: honk; на глобальном уровне программы или в функции, где мы хотим, чтобы она вызывала вызов. ===> Он работает, когда я помещаю его в класс Hovercraft, но я не совсем понимаю, где я должен поместить его в текущий чтобы проверить его на самом деле. Я полагаю, что его ложный положительный, равный ответу. 2.

добавить автомобиль :: honk; в классе Hovercraft ====> отлично работает!

добавить автомобиль Car :: honk(); в классе Hovercraft ====> не работает,() является общей ошибкой:

Автомобиль * c (новый Hovercraft()); C-> гудок(); delete c; ====> Хорошо, я не ожидал этого, но он тоже работает, когда я удаляю «delete c».Во всяком случае, я думаю, что он не отвечает на условия вопроса (используя метод вызова определения на воздушной подушке ИЛИ)

Hovercraft h; h.Car::honk(); ====> отлично работает

Hovercraft h; Автомобиль :: h.honk(); ====> не работает

Там нет ничего, чтобы сделать, порядок наследования в любом случае автомобиль :: гудок() вызывается, когда мы делаем гудок() вызов из воздушной подушки ====> не работа main.cpp: 35: 3: ошибка: запрос члена 'сигналить' неоднозначен

Определить в Overcraft на гудок() метод, который называют автомобиль :: гудок() ====> работа

Можете ли вы дать мне свое мнение об этом? :)