Учитывая следующий кодНаследовать от двух полиморфных классов
class T {
public:
virtual ~T() {}
virtual void foo() = 0;
};
class U {
public:
U() {}
~U() {}
void bar() { std::cout << "bar" << std::endl; }
};
class A : public U, public T {
public:
void foo() { std::cout << "foo" << std::endl; }
};
int main() {
A * a = new A;
std::vector<U*> u;
std::vector<T*> t;
u.push_back(a);
t.push_back(reinterpret_cast<T*>(u[0]));
u[0]->bar();
t[0]->foo();
delete a;
return 0;
}
Я получаю выход я бы ожидать
bar
foo
Однако, если изменить определение U
к
class U {
public:
U() {}
virtual ~U() {}
virtual void bar() { std::cout << "bar" << std::endl; }
};
Я до сих пор компилирую все и без предупреждений/ошибок, но на выходе теперь
bar
bar
Что это за виртуальная декларация, которая мешает мне звонить в foo
?
reinterpret_cast - корень всего зла. Он был создан только для того, чтобы лидер вашей команды знал, что нужно для поиска в вашем коде, чтобы найти ваши ошибки;). –
@KornelKisielewicz, Это потрясающая цитата! –
вы можете вызывать 'foo' на любом указателе на' T' или 'A'. 'foo' не имеет ничего общего с' U'. Поэтому я не совсем понимаю ваш комментарий о «виртуальных объявлениях» в 'U'. –