Я использую Clion IDE и VS Code для разработки и отладки C ++, и я заметил разницу, которая сводит меня с ума.В случае, если у меня есть вектор указателей на подклассы, Clion показывает мне тип подкласса, а VS Code - нет.Вот самый простой код, который я могу воспроизвести:
#include <iostream>
#include <memory>
#include <vector>
#include <string>
class A {
protected:
int x;
public:
A(int x) : x(x) {}
virtual std::string to_str() { return std::to_string(x); }
};
class B : public A {
int y;
public:
B(int x, int y) : A(x), y(y) {}
std::string to_str() override { return std::to_string(x) + '_' + std::to_string(y); }
};
class C : public A {
std::string z;
public:
C(int x, std::string z) : A(x), z(z) {}
std::string to_str() override { return std::to_string(x) + '_' + z; }
};
int main() {
std::vector<std::shared_ptr<A>> v;
v.push_back(std::make_shared<B>(2, 3));
v.push_back(std::make_shared<C>(4,"5"));
for(auto &elem : v) {
std::cout << elem->to_str() << std::endl;
}
return 0;
}
Без виртуальной функции нет информации о подклассе.И Clion, и VS Code используют один и тот же компилятор и GDB.Размещение точки останова внутри for и выполнение в консоли gdb:
p *elem.get()
Я получаю $1 = {_vptr.A = 0x40fc70 <vtable for B+16>, x = 2}
, однако в Clion я получаю $1 = (B) {<A> = {_vptr.A = 0x40fc70 <vtable for B+16>, x = 2}, y = 3}
.
Перечисление конфигурации GDB не показывает никакой разницы (тот же самый gdbinit)Кроме того, перечисление симпатичных принтеров имеет некоторую разницу, но ничего не выделяется.
Я предполагаю, что Clion добавит специальный принтер, но результат будет тот же, если я отключу рендеры библиотеки.Я попробовал это на Windows (mingw64 GCC 8.2) и Linux (GCC 7.3) тоже, тот же результат.
Я проверил документацию по GDB pretty-printer, но она не очень полезна, поэтому я не пытался ее написать,Есть ли специальный симпатичный принтер для отображения типа и членов подкласса?