Неверно: виртуальное наследование предотвращает репликацию субобъекта виртуального базового класса для объектов наследующих классов, являющихся, в свою очередь, субобъектами базовых классов для объекта их общего класса-наследника.
Это означает, что BE и LE-платформами данные будут интерпретироваться по-разному:
unsigned char raw[4] = {}; raw[3] = 1;
// Big-endian platform (ex. MAC OS X on PPC) output: 1
// Little-endian platform (ex. MAC OS X on PPC) output: 16777216
std::cout << *((__int32 *) &raw) << "\n";
Представление данных в памяти не зависит от манеры интерпретации их средой исполнения: конструкторы для классов BigEndian и LittleEndian должны реализовывать семантику побайтового копирования:
LittleEndian::LittleEndian(const T * p) {
const unsigned char * pc = (const unsigned char*) p;
for (unsigned i = 0; i < sizeof(T); i++)
bytes[i] = *pc++;
};
BigEndian::BigEndian(const T * p) {
const unsigned char * pc = (const unsigned char*) p;
for (unsigned i = 0; i < sizeof(T); i++)
bytes[i] = *pc++;
};
Во-первых, ваш код платформозависим: он работает не на уровне представления данных в памяти а на уровне интерпретации данного представления средой исполнения. Соответственно, на BE платформах он работать не будет.
Во-вторых, ваш код не позволяет пребразовать BE в LE (или наоборот):
Во-третьих, endianness определяет порядок индивидуально адресуемых единиц в машинном слове: ваш код для целых занимающих более одного слова будет работать неверно.
Вы не видите разницы между method overloading и method overriding?
Не изображайте из себя жертву: если на то пошло, то я высказываю не собственное «мнение», а «мнение» Christopher Strachey, John Reynolds, и иже с ними. Признавать или не признавать их идеи — ваше право. Однако используя общепринятую терминологию в собственных целях вы вводите людей в заблуждение и только.
In computer science, polymorphism is a programming language feature that allows values of different data types to be handled using a uniform interface.
…
Ad-hoc polymorphism: If the function denotes different and potentially heterogeneous implementations depending on a limited range of individually specified types and its combination, it is called ad-hoc polymorphism. Ad-hoc polymorphism is supported in many languages using function and method overloading.
Parametric polymorphism: If all code is written without mention of any specific type and thus can be used transparently with any number of new types, it is called parametric polymorphism.
…
In the object-oriented programming community, programming using parametric polymorphism is often called generic programming.
Subtype polymorphism: In object-oriented programming, subtype polymorphism or inclusion polymorphism is a concept in type theory wherein a name may denote instances of many different classes as long as they are related by some common super class.
// main.c
main() /* poor style C. Not C++ */
{
double sq2 = sqrt(2); /* call undeclared function */
printf("the square root of 2 is %g\n", sq2); /* call undeclared function */
}
Ответ: Сделать private конструктор копирования и оператор =.
Так вы защититесь только от копирования извне, но сможете копировать в членах класса. Нужно не просто делать их приватными, но ещё и оставлять без реализации.
А операторы приведения иметь, соответственно вид:
Во-вторых, ваш код не позволяет пребразовать BE в LE (или наоборот):
Во-третьих, endianness определяет порядок индивидуально адресуемых единиц в машинном слове: ваш код для целых занимающих более одного слова будет работать неверно.
Функция возвращает ссылку на массив.
Не изображайте из себя жертву: если на то пошло, то я высказываю не собственное «мнение», а «мнение» Christopher Strachey, John Reynolds, и иже с ними. Признавать или не признавать их идеи — ваше право. Однако используя общепринятую терминологию в собственных целях вы вводите людей в заблуждение и только.
http://en.wikipedia.org/wiki/Polymorphism_(computer_science)
В членах и friend'ах.