Так что я смотрю на некоторые странные случаи Полиморпизма и неоднозначность. И есть один случай, который я не могу понять. Я не понимаю, почему последняя строка кода ниже действует таким образом.Виртуальное наследство/Полиморфизм
#include <stdio.h>
#include <iostream>
class Article
{
public :
virtual bool compare(Article *a) { std::cout << "ACA" << std::endl;}; // ACA
};
class Clothe : public Article
{
public :
bool compare (Clothe *c) { std::cout << "CCC" << std::endl;}; // CCC
bool compare (Article *a) { std::cout << "CCA" << std::endl;}; // CCA
};
int main()
{
Article *pta1 = new Article;
Article *pta2 = new Clothe;
Clothe *ptv1 = new Clothe;
pta1->compare(pta2); // print ACA
pta2->compare(pta1); // print CCA
pta2->compare(pta2); // print CCA because compiler needs to explore pta2 to determine which compare to use.
// pta2 is instanced as a Clothe, so one of Clothe's compare will be called.
// And judging by its declaration pta2 is an Article (even thought it's instanced as a Clothe),
// so it will Call Clothe::Compare(Article*). I'm OK with this
pta2->compare(ptv1); // print CCA ??? WHY , pta2 is explored, thus it's type is determined to be of type Clothe.
// And ptv1 is declared as a Clothe, so it should call Clothe::compare(Clothe* c)
// should print CCC, shouldn't it ?
}
Я потерян. Я не понимаю, как g ++ разрешает эту двусмысленность. Любая помощь/объяснение будет приятным. Спасибо за чтение и еще больше спасибо тем, кто отвечает.
PS: Я знаю, что сравнение должно возвращать bool, но здесь это не очень важно.
EDIT: опечатка надвигается во время моего переворота имен переменных на лету, имена изначально были на французском языке, извините за это. Теперь
Проверьте свой код.Похоже, вы ошиблись в определении 'Clothe :: compare' – Lol4t0
Да, действительно, он переводил имена переменных на лету на satckoverflow. Исправлено теперь спасибо, что заметили это. – aramir
мой вопрос: почему нет bool Clothe :: compare (Clothe * c), вызываемый для pta2-> compare (ptv1); – aramir