Полиморфизм в C ++: Нужно ли давать дочерним функциям класса те же аргументы, что и родителям - как перегрузить - PullRequest
1 голос
/ 04 июля 2011

Если у меня есть родительский класс, подобный этому:

class Parent {
protected:
   virtual void foo(type1 var1, type2 var2);
}

и дочерний класс:

class Child : public Parent {
   foo(type1 var1, type2 var2);
}

а что если функции foo в Child не нужны var1 и var2? Есть ли способ сказать компилятору не отдавать память этим переменным, потому что они не используются? Или как ты его перегружаешь? Сочетая перегрузку и полиморфизм, хотя ... как ты это делаешь (если можешь / хотел бы!).

Спасибо.

Ответы [ 2 ]

2 голосов
/ 04 июля 2011

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

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

Например,

class Child : public Parent {
   using Parent :: foo;
   void foo (type1 var1);
};

Child c;
child .foo (type1()); // Valid
child .foo (type1(), type2()); // Valid, calls Parent::foo

void Child :: foo (type1 x) {
    Parent :: foo (x+1, blah);
}

Или, если вы хотите устранить неоднозначность.

class Child : public Parent {
   void foo (type1 var1, type2 var2);
};

Child c;
child .foo (type1(), type2()); // Valid, calls Child::foo
child .Parent :: foo (type1(), type2()); // Valid.

Переопределение - это нечто другое.

class Parent {
    virtual void foo () {}
};

class Child1 : parent {
    void foo ();
};

class Child2 : parent {
    void foo ();
};

void call_foo (Parent & p) {p .foo ();}

Parent p;
Child1 c1;
Child2 c2;
call_foo (p); // Calls Parent::foo
foo (c1);     // Calls Child1::foo
foo (c2);     // Calls Child1::foo
1 голос
/ 04 июля 2011

Вам просто нужно определить другую функцию foo в дочернем классе с другой сигнатурой (т.е. другим аргументом).Это перегрузка функции foo.Компилятор выполнит правильную функцию в соответствии с заданными вами параметрами.

...