Когда вы возвращаете реальный объект (а не ссылку или указатель), он вызывает его копию ctor. В этом случае вы возвращаете базовый класс, поэтому он вызывает его конструктор копирования и создает новый объект базового класса.
#include <iostream>
using namespace std;
class Base
{
public:
Base() = default;
Base(const Base & base) { std::cout << "COPY BASE" << std::endl; }
virtual void print() { cout << "Base" << endl; }
};
class Derived : public Base
{
public:
Derived() = default;
Derived(const Derived & derived) { std::cout << "COPY DERIVED" << std::endl; }
void print() { cout << "Derived" << endl; }
};
Base go()
{
Derived *derived = new Derived();
Base *base = derived;
base->print();
// (*base).print(); // prints "Derived" !
// Base base2 = (*base);
// base2.print(); // prints "Base" !
return *base;
}
int main()
{
Base base = go();
base.print();
return 0;
}
В этом случае выходные данные будут: Derived, COPY BASE, Base
fyireporting (выпущенный в соответствии с лицензией Apache) стоит попытки.
Проект fyiReporting RDL является мощным отчетом и построением диаграммы системы на основе Языка определения отчета (RDL). Табличная, свободная форма, матрица, диаграммы полностью поддерживаются. Вывод отчета может быть отображен как HTML, PDF, XML.Net Control, веб-Архив, и к принтеру. Библиотеки существуют для использования в Вашем ASP.NET, Windows .NET и приложения командной строки.
Попробуйте Microsoft система ReportViewer . Это к использованию Язык Определения Отчета, но это готово выйти из поля. Это не Открытый исходный код, но это - распространяемый файл.
Как предложил Ant, существует также ReportingCloud, который является ответвлением fyiReporting
.