У меня есть следующий фрагмент кода (#include
с и using namespace std
опущена):C++: Виртуальные методы
class A {
public:
void call(){callme();}
private:
virtual void callme() {cout << "I'm A" << endl;}
};
class B : public A {
private:
virtual void callme() {cout << "I'm B" << endl;}
};
class C : public B {
public:
virtual void callme(){ cout << "I'm C" << endl;}
};
int main(){
vector<A> stuff = {
A(), B(), C(),
};
stuff[0].call(); // output: I'm A
stuff[1].call(); // output: I'm A
stuff[2].call(); // output: I'm A
return 0;
}
Как указано в комментариях, выход выше программы является:
I'm A
I'm A
I'm A
Однако я хотел бы, чтобы C++ автоматически распознавал тип, с которым был создан соответствующий элемент. То есть Я хотел бы, чтобы результаты C++
I'm A
I'm B
I'm C
(То есть, компилятор должен выбрать правильный подкласс для меня.)
Возможно ли это в данном случае (т.е. если все элементы выходят из vector
) ?
См: [? В чем проблема нарезка] (http://stackoverflow.com/questions/274626/what-is-the-slicing-problem -in-c) – jrok