#include <iostream>
class A{};
class AA:public A{};
struct X {
void f(A *) {
std::cout << "X::f(A*)\n";
}
};
struct Y:public X {
void f(A *) {
std::cout << "Y::f(A*)\n";
}
};
int main() {
Y *y = new Y();
X *x = new Y();
const X *cx = new Y();
y->X::f(new AA);
x->f(new AA);
}
Print:вызова к функциям с полиморфными указателями
X :: F (A *)
X :: F (A *)
Я не понять почему y->X::f(new AA)
и x->f(new AA)
wont повышение сбор ошибка. Я понимаю, что в обоих случаях вызывается X::f(A *)
. Но каков принцип, по которому компилятор предпочитает использовать этот метод? Функциональная перегрузка с полиморфизмом? Любые правила большого пальца?
Зачем вам ожидать ошибки на самом деле? Я не понимаю. –
В первом случае (** x-> f (новый AA) **) x является указателем на базовый класс X, поэтому вызывает _X :: f (A *) _. Во втором случае (** y-> X :: f (новый AA) **) вы явно сказали, что вас интересует метод из базового класса, написав ** X :: **. –
Так много «новых» ... :-( – Jarod42