2015-02-17 5 views
-4

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

Почему полиморфизм?

Edit:

Вот небольшой фрагмент кода в качестве примера:

enum Suit { Spade, Heart, Club, Diamond }; 
enum Val { Ace=1, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King }; 

class Card { 
private: 
    Val val; 
    Suit suit; 
public: 
    Card(Val val, Suit suit) : val(val), suit(suit) { 
     cout << "Card constructor called" << endl; 
    } 
    int get_val() { return val; } 
    Suit get_suit() { return suit; } 
}; 

class BlackJackCard : public Card { 
public: 
    int garbage; 
    BlackJackCard(Val val, Suit suit) : Card(val, suit), garbage(9) {} 
    int get_val() { 
     Val tmpVal = (Val)Card::get_val(); 
     if(tmpVal == 1) return 11; 
     if(tmpVal < 10) return tmpVal; 
     return 10; 
    } 
    int exclusive_to_BJC() { 
     cout << "I do nothing!! and the garbage value my object holds is " << garbage << endl; 
    } 
}; 

int main() { 
    Card *newCard = new BlackJackCard(King,Spade); 
    cout << newCard->get_val() << endl;  // 13 
    cout << newCard->get_suit() << endl; // 0 

/*Why should I use a base class referencing if I can't access all the*/ 
/*members of the object I have constructed(except for the virtual functions).*/ 
// cout << newCard->exclusive_to_BJC() << endl; 
// cout << newCard->garbage << endl; 

    BlackJackCard *new_bjCard = new BlackJackCard(King,Spade); 
    cout << new_bjCard->get_val() << endl; // 10 
    cout << new_bjCard->get_suit() << endl; // 0 
    cout << new_bjCard->exclusive_to_BJC() << endl; 
} 
+0

Я не понимаю вопроса. Пример кода? –

+0

Ваш замок заблокирован. – DevSolar

+0

Возможный дубликат [Что такое полиморфизм, для чего он используется и как он используется?] (Http://stackoverflow.com/questions/1031273/what-is-polymorphism-what-is-it-for-and- how-is-it-used) –

ответ

0

В основном по этой причине (по ссылке): low coupling.

Если вы говорите о указателях, я понимаю C++, поэтому вы можете также взглянуть на этот explained example.

+0

Идея о реорганизации дизайна для увеличения сплоченности дает мне совсем другую точку зрения. До сих пор я считал, что наследование в основном связано с повторным использованием кода, и поэтому я не смог оценить необходимость полиморфизма, но теперь, когда я думаю о наследовании, как о реализации интерфейса, он имеет полный смысл. Спасибо. – Marcus

+0

Точно! Как вы, кажется, понимаете это хорошо, вы можете взглянуть на мой ответ [здесь] (http://stackoverflow.com/questions/761194/interface-vs-abstract-class-general-oo/27313969#27313969), чтобы понять различия в дизайне ООП (на мой взгляд) между абстрактными классами и интерфейсами (не сосредотачивайтесь на оценке, это действительно поздний ответ на эту тему). Это может помочь вам достичь вашего понимания. – Gnucki

0

Вам не нужно, вы можете. Фактически, подавляющее большинство времени, лучше воспользоваться этой возможностью, чтобы получить лучший код. Рассмотрим:

class Vehicle 
{ 
}; 

class Car : public Vehicle 
{ 
}; 

int f(Vehicle *) 
{ 
    // code written here will be able to work on any type of vehicle. 
} 

OOP позволяет вам писать п() в таким образом, что все транспортные средства обрабатывают таким же образом, с точки зрения е(). Фактически, автомобиль может иметь специализированную функциональность для функции Vehicle, без необходимости даже знать f().

Смежные вопросы